实现INotifyPropertyChanged时,C#中的[NotifyPropertyChangedInvocator]是什么?

Waq*_*ees 37 c# wpf c#-5.0 windows-phone-8 windows-8.1

我看到两种类型的实现 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));
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 第二个:

    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));
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

在第二个中,您会看到[NotifyPropertyChangedInvocator]该方法有一个额外的属性OnPropertyChanged

在我的情况下,两者都表现相同但是什么,为什么以及何时使用它[NotifyPropertyChangedInvocator],这有什么好处?我在网上搜索过但找不到任何好的答案.

Jen*_*ter 71

它是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
           } 
     }
   }
Run Code Online (Sandbox Code Playgroud)

随着方法的[NotifyPropertyChangedInvocator]归属,Resharper会给你一个警告,你正在调用带有(大概)错误值的方法. 因为Resharper现在知道应该调用方法来进行更改通知,它将帮助您将常规属性转换为具有更改通知的属性: NotifyChanged

在此输入图像描述
将其转换为:

public string Name
{
  get { return _name; }
  set
  {
    if (value == _name) return;
    _name = value;
    NotifyChange("Name");
  }
}
Run Code Online (Sandbox Code Playgroud)



此示例来自[NotifyPropertyChangedInvocator]此处找到的属性的文档:
在此输入图像描述

  • 加1解释,而不只是回答链接.应该选择这个作为答案. (11认同)

Saj*_*ran 5

NotifyPropertyChangedInvocatorReshaper 的一项功能。

您只需将其从代码中删除即可使其正常工作

类似的问题在这里被问到:

有谁知道如何获取 [NotifyPropertyChangedInvocator]

  • @WaqasIdrees 您可以发布 NotifyPropertyChangedInvocator 的链接或文档来证明它带有 C# (5认同)
  • +0、-1 对于[抄袭](http://social.msdn.microsoft.com/Forums/vstudio/en-US/5c000063-517a-4193-b7f7-29dadd7cbd4b/c-wpf-app-does-anyone-知道如何获得notifypropertychangedinvocator-statement-to-work?forum=wpf) (3认同)