属性 - 如何避免代码重复

时间:2013-12-20 17:11:17

标签: c#

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

3 个答案:

答案 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;}

    // ...