C# Winform 屬性變更通知 INotifyPropertyChanged 示範

在 C# 中如果想要知道屬性資料是否被變更,可以透過實作 INotifyPropertyChanged 介面,來實現訂閱屬性變更通知,在有通知時觸發事件。

建立一個示範用的類別 MyData ,繼承 INotifyPropertyChanged 介面,會提示有未實現成員,自動補全後程式碼如下:
    
public class MyData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;
}
    

然後建立一個 Text1 屬性,在 setter 的部分增加以下程式碼,使其在設定新內容時會觸發屬性變更通知,並指定有變更的屬性名稱為 Text1
    
public class MyData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    private string _text1 = string.Empty;

    public string Text1
    {
        get => _text1;
        set
        {
            _text1 = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text1)));
        }
    }
}
    

在 Form1 中加入以下程式碼,動態建立一個 TextBox 和 Label ,在 TextBox 有內容變更時寫入 myData.Text1 中。訂閱 myData 的屬性變更事件,只要變更的屬性名稱是 Text1 ,就把 Label 的內容更新。
    
public Form1()
{
    InitializeComponent();

    MyData myData = new();

    TextBox textBox = new()
    {
        Location = new Point(10, 10),
        Size = new Size(100, 20),
        Text = "",
    };
    this.Controls.Add(textBox);
    textBox.TextChanged += (sender, e) => { myData.Text1 = textBox.Text; };


    Label label = new()
    {
        Location = new Point(10, 40),
        Size = new Size(100, 20),
        Text = "",
    };
    this.Controls.Add(label);

    myData.PropertyChanged += (sender, e) =>
    {
        if (e.PropertyName == nameof(myData.Text1))
        {
            label.Text = myData.Text1;
        }
    };
}
    

這樣做的好處就是可以將 UI 邏輯和資料解耦合,並且自動更新介面。雖然上面的範例是從 TextBox 中取得資料,不過在實際使用中我們不論是在 Service 層或是其他地方,只要將資料寫入後介面就會自動更新,非常方便。

留言