2015-08-19 2 views
9

У меня есть класс, которому необходимо вызвать метод NotifyPropertyChanged при изменении любого из его свойств. То, что я видел в примерах, это что-то вроде:Резервный код в геттерах и сеттерах

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 разных вещи. Это похоже на нарушение СУХОЙ.

+0

Существуют рамки MVVM, которые могут сделать это СУХОЙ, например, 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 работает, переписав свой DLL после MsBuild делаются с ним, чтобы реализовать свой код INPC.

+0

Принял этот ответ, потому что это тот, который я использовал. – Arcinde

4

Да, это идиоматический способ поднять PropertyChanged. Там нет простого способа, так как сеттеру нужен дополнительный вызов метода, и единственный способ сделать это - это полное поле свойств и поддержки.

На самом деле это было хуже, так же как и до .NET 4.5 вам пришлось передать имя свойства в виде строки в «NotifyPropertyChanged», поэтому изменение имени на самом деле уже немного проще.

Тем не менее, существуют рамки (MVVMLight, Caliburn.Micro), которые будут вводить рейз для вас, если вы решите их использовать. Конечно, они просто дают вам немного синтаксического сахара, и конечный результат тот же.

0

PostSharp (https://www.postsharp.net/model/inotifypropertychanged) - это еще одна опция времени компиляции для автоматического создания события повышения INotifyPropertyChanged, использующего атрибуты для указания методов, для которых это должно быть выполнено.

Смежные вопросы