INotifyPropertyChanged 和 propertyName

INotifyPropertyChanged and propertyName

在实施INotifyPropertyChanged时,我一直不确定propertyName的含义。所以通常你将 INotifyPropertyChanged 实现为:

public class Data : INotifyPropertyChanged {
   public event PropertyChangedEventHandler PropertyChanged;

   private void NotifyPropertyChanged(string propertyName = "") {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

   private string itsID;
   public string ID { 
             get { return itsID; }
             set { 
                   if (itsID != value) {
                     itsID = value; 
                     NotifyPropertyChanged("ID");
                  }
   }
}

对于 NotifyPropertyChanged(string propertyName)propertyName 论点,我一直不确定。

  1. 可以是任意字符串吗(如上例中的 "MyID")?
  2. 或者 .NET 是否使用反射将其与 class 中的 属性 对齐,因此它必须与 属性 的名称完全匹配?
  3. 如果 propertyNameProperty 的名称不完全匹配怎么办,.NET 是否将整个对象视为 changed

如果您想准确匹配 属性 的名称,您可以使用名为 nameof 的新 C#6 功能。 nameof 功能可以回答您所有的问题,因为我们可以说使用 nameof 的主要优点一言以蔽之就是 重构 。 "refactoring" 是您根据问题查找的词:

NotifyPropertyChanged(nameof(ID));

例如 重命名 ID 也会更改 属性 的名称,否则会破坏编译,但以下不会:

NotifyPropertyChanged("ID")

它必须与 属性 的名称完全匹配。附带说明一下,您应该在调用 PropertyChanged 之前检查该值是否已实际更改,因为这是一个相对昂贵的调用(WPF 不会知道 属性 没有更改)。在VS2015中,还可以使用nameof运算符。

它本身并不是 .NET Framework 本身,几乎每个 PropertyChanged 订户(其中一些确实碰巧作为框架的一部分分发)假设您按预期使用界面, 通过发送 属性 名称。如果您发送 属性 MyID 已更改的通知,当另一个组件正在查看 属性 ID 时,它通常会看到通知,比较名称,然后总结 "this notification isn't for me".