INotifyPropertyChanged
の2つのタイプの実装が表示されます
最初の1つ:
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));
}
}
}
2番目:
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));
}
}
}
2番目の方法では、メソッドOnPropertyChanged
に追加の属性[NotifyPropertyChangedInvocator]
があります
私の場合、どちらも同じように動作しますが、この[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は変更通知を行うためにthatメソッドを呼び出す必要があることを知っているため、通常のプロパティを変更通知のあるプロパティに変換するのに役立ちます。
これを次のように変換します:
public string Name
{
get { return _name; }
set
{
if (value == _name) return;
_name = value;
NotifyChange("Name");
}
}
この例は、[NotifyPropertyChangedInvocator]
属性は次のとおりです。