属性 – 如何避免代码重复

在创建一个将在视图模型中用于遵循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;} 

只是因为我必须在setter上举起活动。 除了使我的代码更长,我认为它具有复制和粘贴编程的代码味道。 我该怎么做才能避免这种情况? 是否有可能构建一个通用类,我不知道,我可以实现MVVMEnabled

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

这样generics类中的代码将确保在设置值时触发OnPropertyChanged?

在我工作的地方,我们做了类似于你的MVVMEnabled建议,它运作良好。

唯一要注意的是,属性的​​值现在隐藏在MVVMEnabled (例如值)的属性中,因此您最终会得到一个稍微冗长的绑定表达式,例如{Binding MyStringPropertyA.Value}

要做到这一点, MVVMEnabled实现INotifyPropertyChanged。 你需要一个属性,比如Value ,它是将被管理的值(你的例子中的一个字符串):

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

在您的主类中,将您的属性设为只读:

 public MVVMEnabled MyStringPropertyA {get;private set;} 

并在构造函数中初始化它:

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

它是只读的原因是因为你将通过Value属性改变值,而不是MVVMEnabled属性。

现在,当你需要改变它时,做这样的事情:

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

只要您的绑定是这样的:

 {Binding MyStringPropertyA.Value} 

你应该没事。

好吧,我建议你创建代码片段,这样就不会花费太多精力来记下多个属性。

我认为这样的事情不会起作用 – 至少我以前从未见过这样的事情。

相反,您可以使用PostSharp的面向方面编程来执行此操作:

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