MVVM - RaisePropertyChanged将代码变成一团糟

时间:2010-03-31 12:46:23

标签: silverlight silverlight-3.0 mvvm

MVVM的新手,请原谅我的无知。

我认为我正确使用它,但我发现我的ViewModel有太多这些:

RaisePropertyChanged("SomeProperty")

每当我设置一个属性时,我必须提高该死的属性。

我想念我可以去的日子:

public int SomeInteger { get; private set;}

这些天我必须在任何地方坚持使用“RaisePropertyChanged”,否则我的UI不会反映出这些变化:(

我做错了还是其他人因为过多的魔法字符串和旧学校的业主而烦恼?

我应该使用依赖属性吗? (我怀疑这有助于代码膨胀)

尽管存在这些问题,我仍然认为MVVM是要走的路,所以我想这就是它。

5 个答案:

答案 0 :(得分:12)

看看这个What is the best or most interesting use of Extension Methods you've seen?

它描述了我的Model和ViewModel类用于启用以下强类型(无魔术字符串)属性的扩展方法和辅助方法。

private string _name;
public string Name
{
    get { return _name; }
    set { this.NotifySetProperty(ref _name, value, () => this.Name); }
}

这就像我认为的那样简单。希望它有所帮助。

答案 1 :(得分:7)

您可以使用PostSharp的NotifyPropertyChanged属性。然后你所要做的就是在类上放置一个属性,就是这样。 E.g:

[NotifyPropertyChanged]
public class MyClass 
{
    public string MyProperty { get; set; }
}

答案 2 :(得分:4)

从不同的角度看待事物是有帮助的:那些不是复杂的.NET属性,而是简化的依赖属性。

WPF中视图模型的可绑定属性与.NET属性不同,而是一种键值存储。如果你想要DependencyObject的轻量级替代品,你有能力实现这个键值存储,只需在setter中调用某些函数 - 实际上并不坏。当然,远非理想,但你的观点肯定是不公平的。

答案 3 :(得分:0)

它不会让你回到干净的代码,但我使用一个简单的扩展方法来获取属性名称,以避免魔术字符串的问题。它还保持代码的可读性,即它明确发生了什么。

扩展方法简单如下:

public static string GetPropertyName(this MethodBase methodBase)
{
    return methodBase.Name.Substring(4);
}

这意味着您的属性集对名称更改具有弹性,如下所示:

private string _name;
public string Name
{
    get { return _name; }
    set 
    {
            name = value;
            RaisePropertyChanged(MethodBase.GetCurrentMethod().GetPropertyName()); 
    }
}

我已经写了更多关于这个extension method here的信息,我已经published a matching code snippet here了。

答案 4 :(得分:0)

这将有助于: “某种魔法” 轻松的INotifyPropertyChanged

[http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a] [1]

作为将其添加到一个属性的示例:

[Magic] 
public string Name { get { return _name; } set { _name = value; } } 
string _name;

将其添加到所有类属性的另一个示例:

[Magic] 
public class MyViewModel: INotifyPropertyChanged 
{ 
  public string Name { get; set; } 
  public string LastName { get; set; } 
  ..... 
}