Свойства – как избежать повторения кода

При создании classа, который будет использоваться в viewmodel для приложения, следующего за шаблоном MVVM, я должен реализовать свойства следующим образом:

private string _MyStringPropertyA; public string MyStringPropertyA { get {return _MyStringPropertyA;} set { _MyStringPropertyA=value; OnPropertyChanged(()=>MyStringPropertyA); } } private string _MyStringPropertyB; public string MyStringPropertyB { get {return _MyStringPropertyB;} set { _MyStringPropertyB=value; OnPropertyChanged(()=>MyStringPropertyB); } } 

вместо более простых

 public string MyStringPropertyA {get;set;} public string MyStringPropertyA {get;set;} 

просто потому, что я должен поднять это событие на сеттер. Помимо того, что мой код длиннее, я думаю, что у него есть запах кода для копирования и вставки. Что я могу сделать, чтобы этого избежать? Возможно ли построить общий class, например, я не знаю, MVVMEnabled который я могу реализовать как:

 public MVVMEnabled MyStringPropertyA {get;set;} public MVVMEnabled MyStringPropertyB {get;set;} 

так что код в родовом classе будет гарантировать, что OnPropertyChanged срабатывает при установке значения?

Где я работаю, мы делаем что-то похожее на ваше предложение MVVMEnabled и оно работает хорошо.

Единственное, на что нужно обратить внимание, это то, что значение свойства теперь убирается в свойстве MVVMEnabled (например, значение), поэтому вы получаете несколько более подробное выражение привязки, например {Binding MyStringPropertyA.Value}

Для этого MVVMEnabled реализует MVVMEnabled . Вам понадобится свойство, скажем Value которое является значением, которое будет управляться (строка в вашем примере):

 public T Value { get{return m_Value;} set { if(m_Value != value) { m_Value = value; OnPropertyChanged(()=>Value); } } } 

В вашем основном classе сделайте свою собственность только для чтения:

 public MVVMEnabled MyStringPropertyA {get;private set;} 

И инициализируйте его в конструкторе:

 public SomeModel() { this.MyStringPropertyA = new MVVMEnabled(); } 

Причина, по которой он MVVMEnabled только для чтения, заключается в том, что вы измените значение с помощью свойства Value , никогда не MVVMEnabled свойством MVVMEnabled .

Теперь, когда вам нужно изменить его, сделайте что-то вроде этого:

 this.MyStringPropertyA.Value = "hello, world"; 

И пока ваша привязка такова:

 {Binding MyStringPropertyA.Value} 

Вы должны быть в порядке.

Я бы посоветовал вам создавать fragmentы кода, поэтому он не потребует много усилий для записи нескольких свойств.

Я не думаю, что что-то в этом роде будет работать – по крайней мере, я никогда раньше такого не видел.

Вместо этого вы можете использовать Aspect-Oriented Programming с PostSharp для этого:

 [NotifyPropertyChanged] public class MyClass { public string MyStringPropertyA {get;set;} public string MyStringPropertyA {get;set;} // ...