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
参数
如果要精确匹配属性的名称,可以使用名为的新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
@Alexandrunameof
好得多的方法当然有它的用途,但是我们这里讨论的是属性设置器内部的引用。您已经发现,在没有任何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
,然后使用该字符串对控件进行更新。