Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# INotifyPropertyChanged和propertyName_C#_.net_Inotifypropertychanged - Fatal编程技术网

C# INotifyPropertyChanged和propertyName

C# INotifyPropertyChanged和propertyName,c#,.net,inotifypropertychanged,C#,.net,Inotifypropertychanged,在实现INotifyPropertyChanged时,我从未确定propertyName的含义。因此,通常您将INotifyPropertyChanged实现为: public class Data : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string 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
参数

  • 可以是任意字符串(如上面示例中的“MyID”)吗
  • 或者.NET是否使用反射将其与类中的属性对齐,以便它必须与属性的名称完全匹配 < >如果<代码>属性名与<代码>属性< /代码>的名称不匹配,那么.NET是否将整个对象视为“代码>更改?

  • 如果要精确匹配属性的名称,可以使用名为的新C#6功能。
    nameof
    功能可以回答您的所有问题,因为我们可以说在一个词中使用
    nameof
    的主要优点是重构。“重构”这个词是你根据自己的问题寻找的:

    NotifyPropertyChanged(nameof(ID));
    
    例如重命名
    ID
    也会更改属性的名称,或者会中断编译,但以下情况不会:

    NotifyPropertyChanged("ID")
    

    它必须与属性的名称完全匹配。另一方面,在调用PropertyChanged之前,您应该检查该值是否已实际更改,因为这是一个相对昂贵的调用(WPF不知道该属性是否已更改)。在VS2015中,您还可以使用operator的名称。

    这不是.NET Framework本身,而是几乎所有的
    属性更改的订阅者(其中一些确实是作为框架的一部分分发的),他们假设您通过发送属性名称按预期使用接口。如果您发送属性
    MyID
    已更改的通知,当另一个组件查看属性
    ID
    时,它通常会看到该通知,比较名称,并得出结论“此通知不适合我”。

    C#6没有添加太多内容:C#5已经提供了
    [CallerMemberName]
    属性<代码>NotifyPropertyChanged()为拼写错误留下了更少的空间。也就是说,这应该是一个评论,它并没有试图回答这个问题。@hvd Yes。但是对我来说,
    nameof
    最常用的情况是在使用
    INotifyPropertyChanged
    接口时。@hvd这实际上增加了很多。您现在可以更有效地链接数据。使用
    nameof
    时,只需右键单击并查找所有引用。比这个
    CallerMemberName
    @Alexandru
    nameof
    好得多的方法当然有它的用途,但是我们这里讨论的是属性设置器内部的引用。您已经发现,在没有任何IDE功能的情况下,@hvd是的,但是
    NotifyPropertyChanged
    的情况也存在于属性设置器之外,而属性设置器本身就是
    nameof
    可以为开发人员处理的。不用担心,更有条理,这就是我喜欢的。如果不匹配怎么办?@Denis,用户界面不会更新。绑定是按名称进行的。只是一个安全注意事项:当您执行
    if(PropertyChanged!=null)
    时,请尝试避免这种情况,因为在
    null
    检查
    PropertyChanged
    之后,可能确实会再次执行
    null
    。相反,更安全/更好的做法是先设置局部变量,然后检查。e、 g.
    var handler=PropertyChanged;如果(handler!=null){handler()…//raise}
    -或从C#6开始,您可以使用新的“null条件运算符”:
    PropertyChanged?.Invoke(…)
    ,它同时作为
    null
    检查并立即调用。这里的解释非常好()我认为这是执行所有这些()的实际跟踪的.NET源代码。WPF基本上订阅属性更改事件,然后使用事件参数,其中一个是用于ID的字符串,例如,
    MyID
    ,然后使用该字符串对控件进行更新。