如何使用事件通知属性值更改
要观察属性值更改,您可以使用 INotifyPropertyChanged 接口,其中包括 PropertyChanged 事件。消费者可以订阅此事件以检测特定属性的更改。
public interface INotifyPropertyChanged { event PropertyChangedEventHandler PropertyChanged; }
通过事件安全实现 INotifyPropertyChanged
虽然 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; }
这个实现:
其他特定属性更改事件
为了获得额外的粒度,您可以为特定属性定义单独的事件,例如:
protected void OnImageFullPathChanged(EventArgs e) { EventHandler handler = ImageFullPathChanged; if (handler != null) handler(this, e); } public event EventHandler ImageFullPathChanged;
在属性的 setter 中,调用常规 OnPropertyChanged 事件和特定 OnImageFullPathChanged
简化属性名称获取(仅限 C# 4.5)
最后,对于 C# 4.5 及以上版本,利用 CallerMemberAttribute 自动提取属性名称,无需对于手动字符串文字:
protected void OnPropertyChanged( [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); }
以上是如何安全地实现 INotifyPropertyChanged 来获取属性值更改通知?的详细内容。更多信息请关注PHP中文网其他相关文章!