我看到了INotifyPropertyChanged
的两种实现
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在第二个中,您看到方法
[NotifyPropertyChangedInvocator]
上还有一个额外的属性OnPropertyChanged
就我而言,两者的行为相同,但是什么,为什么以及何时使用此
[NotifyPropertyChangedInvocator]
,这有什么好处呢?我在互联网上进行搜索,但找不到任何好的答案。 最佳答案
这是其Annotations的Resharper属性-旨在警告您,然后您的代码看起来可疑:)
考虑一下:
public class Foo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void NotifyChanged(string propertyName) { ... }
private string _name;
public string Name {
get { return _name; }
set {
_name = value;
NotifyChanged("LastName");//<-- warning here
}
}
}
在
[NotifyPropertyChangedInvocator]
方法上使用NotifyChanged
属性, Resharper将向您发出警告,表示您正在使用(可能是)错误值调用该方法。因为Resharper现在知道应该调用该方法来发出更改通知,所以它将帮助您将普通属性转换为具有更改通知的属性:
将其转换为:
public string Name
{
get { return _name; }
set
{
if (value == _name) return;
_name = value;
NotifyChange("Name");
}
}
本示例来自有关
[NotifyPropertyChangedInvocator]
属性的文档,该文档位于以下位置: