NotifyPropertyChangedInvocator

NotifyPropertyChangedInvocator

我看到了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]属性的文档,该文档位于以下位置:

    10-05 23:02