问题描述
该INotifyPropertyChanged
接口
与事件实现。该界面只有一个成员,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")
。
由于我们有.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();
}
}
}
解决方法
有一个属性,它名为 ImageFullPath1
public string ImageFullPath1 {get; set; }
每当值改变时,我都会触发一个事件。我知道更改INotifyPropertyChanged
,但是我想通过事件来更改。