当创建一个将在视图模型中用于遵循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<T>
我可以实现为:
public MVVMEnabled<string> MyStringPropertyA {get;set;}
public MVVMEnabled<string> MyStringPropertyB {get;set;}
这样泛型类中的代码将确保在设置值时触发OnPropertyChanged?
答案 0 :(得分:2)
在我工作的地方,我们会执行类似于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<string> MyStringPropertyA {get;private set;}
并在构造函数中初始化它:
public SomeModel()
{
this.MyStringPropertyA = new MVVMEnabled<string>();
}
它是只读的原因是因为你将通过Value
属性更改值,而不是MVVMEnabled
属性。
现在,当您需要更改它时,请执行以下操作:
this.MyStringPropertyA.Value = "hello, world";
只要您的绑定是这样的:
{Binding MyStringPropertyA.Value}
你应该没事。
答案 1 :(得分:1)
我建议您创建代码片段,这样就不会花费太多精力来记下多个属性。
答案 2 :(得分:0)
我不认为这样的事情会起作用 - 至少我以前从未见过这样的事情。
相反,您可以使用PostSharp的面向方面编程来执行此操作:
[NotifyPropertyChanged]
public class MyClass
{
public string MyStringPropertyA {get;set;}
public string MyStringPropertyA {get;set;}
// ...