这只是我在学习 Attributes 时的想法,我使用 INotifyPropertyChanged 太多了,这只是一个想法,我想听听一些关于它的意见。(我知道这需要一些工作编译器而不是消费者端)
由于 INotifyPropertyChanged 大多数时候与相同的模式一起使用.. 就像调用使用属性名称触发事件的方法一样,是否可以将其设计为属性并使用自动属性?以便编译器知道它需要添加对 PropertyChanged 事件的调用? 所以如果我们上课....
public class DemoCustomer : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private string companyNameValue = String.Empty;
...
}
而不是声明属性
public string CompanyName
{
get
{
return this.companyNameValue;
}
set
{
if (value != this.companyNameValue)
{
this.companyNameValue = value;
NotifyPropertyChanged("CompanyName");
}
}
}
如果我们可以通过此属性向编译器指示它需要在新值与先前值不同时使用属性名称生成对 PropertyChanged 的调用,我们就可以做这样的事情
[NotifyPropertyChanged]
public string CompanyName
{
get;set;
}
在不使用 Attribute 的情况下,我们仍然可以用旧的方式为一些自定义行为编码。
最佳答案
以防万一有人遇到此线程并使用 C# 5(VS 2012+、.NET 4.5+)。现在使用 CallerMemberNameAttribute
可以“更轻松地”完成这种情况。此属性应用于字符串参数,并导致编译器在我们使用默认值时(即未传递参数时)传递调用方法/属性的名称。使实现 INotifyPropertyChanged
变得不那么烦人。例如:
public class MyClass
{
private string myProperty;
public string MyProperty
{
get { return myProperty; }
set
{
myProperty = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
因此,您只需要在每个 setter 中使用 OnPropertyChanged()
来发送事件,而不必处理属性名称的硬编码字符串。
关于c# - 使用属性... INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1662745/