引發屬性值變更的事件
使用屬性時,您可能會遇到需要在屬性值變更時觸發事件的情況
問題:
有一個名為ImageFullPath1 的屬性,需要在其值變更時觸發一個事件。儘管存在 INotifyPropertyChanged,但要求是使用事件來實作解決方案。
答案:
INotifyPropertyChanged 介面確實是基於事件的。它有一個成員,PropertyChanged,這是一個允許消費者訂閱的事件。
但是,Richard 建議的解決方案並不可靠。更安全的實作是:
public class MyClass : INotifyPropertyChanged { private string imageFullPath; protected void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, e); } protected void OnPropertyChanged(string propertyName) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } public string ImageFullPath { get { return imageFullPath; } set { if (value != imageFullPath) { imageFullPath = value; OnPropertyChanged("ImageFullPath"); } } } public event PropertyChangedEventHandler PropertyChanged; }
此實作的特點:
其他特定於屬性的事件:
如果您也想建立一個事件對於特定屬性的更改,例如ImageFullPath,您可以新增:
protected void OnImageFullPathChanged(EventArgs e) { EventHandler handler = ImageFullPathChanged; if (handler != null) handler(this, e); } public event EventHandler ImageFullPathChanged;
在OnPropertyChanged("ImageFullPath") 之後調用OnImageFullPathChanged(EventArgs.Empty)。
.Net 4.5 中的CallerMemberAttribute:
在.Net 4.5 及更高版本中,CallerMemberAttribute允許您刪除來源程式碼中硬體編碼的屬性名稱:
protected void OnPropertyChanged( [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } public string ImageFullPath { get { return imageFullPath; } set { if (value != imageFullPath) { imageFullPath = value; OnPropertyChanged(); } } }
以上是如何在 C# 引發屬性值變化事件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!