There is a property, it's named ImageFullPath1
public string ImageFullPath1 {get; set; }
I'm going fire an event whenever its value changed. I am aware of changing INotifyPropertyChanged
, but I want to do it with events.
There is a property, it's named ImageFullPath1
public string ImageFullPath1 {get; set; }
I'm going fire an event whenever its value changed. I am aware of changing INotifyPropertyChanged
, but I want to do it with events.
INotifyPropertyChanged
接口is通过事件实现.该接口只有一个成员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;
}
请注意,这将执行以下操作:
抽象属性更改通知方法,以便您可以轻松地将其应用于其他属性;
复制试图调用它的PropertyChanged
个委托before(如果不这样做,将产生竞争条件).
正确实现INotifyPropertyChanged
接口.
如果要additionally为正在更改的specific属性创建通知,可以添加以下代码:
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
,它允许在源代码中go 掉属性名称的硬编码字符串:
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();
}
}
}