2015-08-19 52 views
9

我有一个类需要调用方法NotifyPropertyChanged当它的任何属性发生变化时。我在例子中看到的是这样的:getter和setter中的冗余代码

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(); } 
} 
// ....... 

这真的是这样做的惯用方法吗?它需要为我想添加的每个属性添加几行样板。而且,如果我想更改属性和字段的名称,我需要更改4个不同的东西。这似乎违反了DRY。

+0

有MVVM框架,可以使这个DRY,就像MVVM Light https://mvvmlight.codeplex.com/! – Fals

回答

2

您可能想尝试使用AOP框架来实现您的INotifyPropertyChanged。我在这个例子中个人最喜欢被称为Fody.

你会写这样的类...

[ImplementPropertyChanged] 
public class Foo 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

Fody工作方式的MSBuild与它完成后,实现您INPC代码重写你的DLL。

+0

接受这个答案,因为它是我最终使用的。 – Arcinde

4

是的,这是提高PropertyChanged的惯用方法。有没有简单的方法,因为setter需要一个额外的方法调用,唯一的方法是完整的属性和后台字段。

它实际上过去更糟糕,因为在.NET 4.5之前,您必须将属性名称作为字符串传递给“NotifyPropertyChanged”,因此现在更改名称实际上比较容易。

也就是说,有框架(MVVMLight,Caliburn.Micro),如果您选择使用它们,将为您添加事件提升。当然,他们只是给你一点点的糖,而最终的结果是一样的。