在 C# 中如果想要知道屬性資料是否被變更,可以透過實作 INotifyPropertyChanged 介面,來實現訂閱屬性變更通知,在有通知時觸發事件。
建立一個示範用的類別 MyData ,繼承 INotifyPropertyChanged 介面,會提示有未實現成員,自動補全後程式碼如下:
然後建立一個 Text1 屬性,在 setter 的部分增加以下程式碼,使其在設定新內容時會觸發屬性變更通知,並指定有變更的屬性名稱為 Text1
在 Form1 中加入以下程式碼,動態建立一個 TextBox 和 Label ,在 TextBox 有內容變更時寫入 myData.Text1 中。訂閱 myData 的屬性變更事件,只要變更的屬性名稱是 Text1 ,就把 Label 的內容更新。
這樣做的好處就是可以將 UI 邏輯和資料解耦合,並且自動更新介面。雖然上面的範例是從 TextBox 中取得資料,不過在實際使用中我們不論是在 Service 層或是其他地方,只要將資料寫入後介面就會自動更新,非常方便。
建立一個示範用的類別 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 層或是其他地方,只要將資料寫入後介面就會自動更新,非常方便。
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com