我有一个类需要在更改任何属性时调用方法private string property1_;
public string Property1
{
get { return property1_; }
set { property1_ = value; NotifyPropertyChanged(); }
}
private string property2_;
public string Property2
{
get { return property2_; }
set { property2_ = value; NotifyPropertyChanged(); }
}
// .......
。我在例子中看到的是:
Date | Item | Invoice_number
这真的是惯用的方式吗?对于我想要添加的每个属性,它需要几行样板。此外,如果我想更改属性和字段的名称,我需要更改4个不同的东西。这似乎违反了DRY。
答案 0 :(得分:4)
是的,这是提升PropertyChanged
的惯用方式。没有简单的方法,因为setter需要一个额外的方法调用,唯一的方法是使用完整的属性和支持字段。
它实际上曾经更糟糕,因为在.NET 4.5之前你必须将属性名称作为字符串传递给" NotifyPropertyChanged",所以现在更改名称实际上要容易得多。
也就是说,如果您选择使用它们,会有一些框架(MVVMLight,Caliburn.Micro)为您注入事件加注。当然,它们只是给你一点合成糖,最终结果是一样的。
答案 1 :(得分:2)
您可能想尝试使用AOP框架来实现INotifyPropertyChanged
。我个人对此示例的最爱是Fody.
你会写这样的课......
[ImplementPropertyChanged]
public class Foo
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
Fody的工作原理是在MsBuild完成之后重写你的dll,以实现你的INPC代码。
答案 2 :(得分:0)
PostSharp(https://www.postsharp.net/model/inotifypropertychanged)是另一个编译时选项,用于自动生成INotifyPropertyChanged事件,该事件使用属性来指示应该执行此操作的方法。