引发属性值更改的事件
使用属性时,您可能会遇到需要在属性值发生变化时触发事件的情况
问题:
有一个名为 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中文网其他相关文章!