[C#.NET][WPF] 控制項的資料繫結(二)–Static Resource
在.NET世界裡資料繫結是件很重要的事,它可以省掉你相當多的功夫,若你還不太瞭解資料繫結能做什麼,簡單來說,它就是用來同步UI與物件的資料,我們一定需要讓使用者在UI上操作,使用者在UI所操作的資料都能同時與後端的資料同步,這省略掉了我們處理的工夫;INotifyPropertyChanged 介面在資料繫結上是一個很重要的工作,它是用來通知前端UI,後端資料已經更新了,假設我現在有以下Member類別:
public class Member
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
}
然後在xaml區段裡建立資源
1.定義命名空間 xmlns:local="clr-namespace:WpfApplication1" ,必須先在根物件裡定義參考物件的命名空間
2.定義類別資源檔的名稱,x:Key="member"
3.定義屬性初始值,ID="1" Age="12" Name="gy" Phone="0806449",當然你若沒有要初始值可以不用打
完成後就可以在文件大綱裡找到剛剛建立的資源檔
然後這樣就可以拿來當控制項的資料來源,先規劃以下UI
有兩種方式可以定義資料來源:
- 控制項各別指定Static Resource
- 在父控制項指定DataContext
- 控制項各別指定Static Resource
依序定義好所有控制項的屬性後,可觀察一下xaml檔案的內容
繫結完成後,UI就會出現剛剛定義的初始化資料
- 在父控制項指定DataContext
設定完成的xaml及DataContext
父控制項有了DataContext後,子控制項只要指定路徑(Path),不需要像上一個方法那樣要重複指定來源
觀察一下xaml,跟上一個方法比起來也比較短一些了
我要程式碼觀察該物件的狀況,加入以下程式碼
Member _Member = null;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
object obj = this.Resources["member"];
if (obj is Member)
{
this._Member = (Member)obj;
}
}
private void btnShow_Click(object sender, RoutedEventArgs e)
{
if (this._Member == null)
return;
string result = string.Format("{0}\n{1}\n{2}\n{3}", this._Member.ID, this._Member.Age, this._Member.Name, this._Member.Phone);
MessageBox.Show(result);
}
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{
if (this._Member == null)
return;
this._Member.Age = 11;
this._Member.ID = 222;
this._Member.Name = "余小章";
this._Member.Phone = "00";
}
當我按下Update按鈕後,UI的資料並沒有變更,按下Show按鈕後確認資料是有變更的
這就是資料來源沒有實作 INotifyPropertyChanged 的關係,將Menber類別修改成以下,這時再按下Update,UI就會同步了。
public class Member : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private int _ID;
public int ID
{
get { return _ID; }
set
{
_ID = value;
OnPropertyChanged("ID");
}
}
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
OnPropertyChanged("Name");
}
}
private int _Age;
public int Age
{
get { return _Age; }
set
{
_Age = value;
OnPropertyChanged("Age");
}
}
private string _Phone;
public string Phone
{
get { return _Phone; }
set
{
_Phone = value;
OnPropertyChanged("Phone");
}
}
}
後記:
在Winform裡也是會有同樣的情況會發生,[ADO.NET][Winform][.NET] DTO 與 DataGridView更新問題
範例下載:WpfBindingDemo.zip
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET