有一个属性,它名为 ImageFullPath1
public string ImageFullPath1 {get; set; }
每当值改变时,我都会触发一个事件。我知道更改INotifyPropertyChanged,但是我想通过事件来更改。
INotifyPropertyChanged
该INotifyPropertyChanged接口 是 与事件实现。该界面只有一个成员,PropertyChanged这是消费者可以订阅的事件。
PropertyChanged
理查德发布的版本不安全。以下是安全实现此接口的方法:
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; }
请注意,这将执行以下操作:
抽象属性更改通知方法,以便您可以轻松地将其应用于其他属性;
在 尝试调用PropertyChanged代理 之前,先 制作该代理的副本(否则,将创建竞争条件)。
正确实现INotifyPropertyChanged接口。
如果要为更改的 特定 属性 另外 创建通知,则可以添加以下代码: __
protected void OnImageFullPathChanged(EventArgs e) { EventHandler handler = ImageFullPathChanged; if (handler != null) handler(this, e); } public event EventHandler ImageFullPathChanged;
然后在该行OnImageFullPathChanged(EventArgs.Empty)之后添加该行OnPropertyChanged("ImageFullPath")。
OnImageFullPathChanged(EventArgs.Empty)
OnPropertyChanged("ImageFullPath")
由于我们有.Net 4.5,因此存在CallerMemberAttribute,它可以摆脱源代码中属性名称的硬编码字符串:
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(); } } }