属性 – 如何避免代码重复
在创建一个将在视图模型中用于遵循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;} // ...