[C#.NET][WPF] 控制項的資料繫結(二) - Static Resource

[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",當然你若沒有要初始值可以不用打

 

image


完成後就可以在文件大綱裡找到剛剛建立的資源檔

image

然後這樣就可以拿來當控制項的資料來源,先規劃以下UI

image

有兩種方式可以定義資料來源:

  1. 控制項各別指定Static Resource
  2. 在父控制項指定DataContext

 


  • 控制項各別指定Static Resource

image

image

 

image

 

依序定義好所有控制項的屬性後,可觀察一下xaml檔案的內容

image

 

繫結完成後,UI就會出現剛剛定義的初始化資料

image

 


  • 在父控制項指定DataContext

image

image

 

設定完成的xaml及DataContext

image

 

父控制項有了DataContext後,子控制項只要指定路徑(Path),不需要像上一個方法那樣要重複指定來源

image

 

觀察一下xaml,跟上一個方法比起來也比較短一些了

image

 


我要程式碼觀察該物件的狀況,加入以下程式碼

 


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按鈕後確認資料是有變更的

image

 


 

 

 

 

 

 

 

 

 

 

這就是資料來源沒有實作 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

Image result for microsoft+mvp+logo