2010-03-31 61 views
9

MVVM的新手请原谅我的无知。MVVM - RaisePropertyChanged把代码弄乱了

我想我使用它的权利,但我觉得我的ViewModel有太多的这些:

RaisePropertyChanged("SomeProperty") 

我每次设置属性。我必须提出那个该死的性质改变了。

我怀念的日子,我可以只是去:

public int SomeInteger { get; private set;} 

这几天我一直坚持的“RaisePropertyChanged”在海内外或我的UI不能反映变化:(

我做它错了,还是其他人越来越恼火的魔术字符串和旧学校的过度数量的设置?

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

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

+1

“我错过了我可以去的日子”我们很容易忘记,在C#2中你根本无法做到这一点。 ;) – AnthonyWJones 2010-03-31 13:17:04

+0

雅我想我被宠坏了,但尽管取得了进展,我仍然认为可能有一个更清洁的方式来实现这个东西。我不知道内部工作/折衷足够,虽然... – vidalsasoon 2010-03-31 14:43:26

回答

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); } 
} 

,因为我觉得它可以得到这是一样简单。希望能帮助到你。

+0

谢谢。有点高兴知道我不是唯一有问题的人。 – vidalsasoon 2010-03-31 13:04:25

4

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

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

8

您可以使用PostSharp的NotifyPropertyChanged属性。那么你所要做的就是在课堂上加上一个属性,就是这样。例如: -

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

有趣!好奇开销虽然... – vidalsasoon 2010-03-31 14:52:22

+3

因为PostSharp只是修改​​编译的类并注入完全相同的手动编写的代码,所以没有运行时间的开销。有一个小的构建时间开销,但我发现它可以忽略不计。 – 2010-03-31 15:22:14

+0

这种方法唯一的缺点是,有时需要为引用setter的属性以外的属性使用RaisePropertyChanged。 – Random 2011-10-07 17:16:31

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

+0

老问题,我知道:) 另一种方法是封装基类内的RaisePropertyChanged并使用以下方法签名:OnRaisePropertyChanged([CallerMemberName] propertyName =“”)。通过这种方式,您可以调用该方法而无需编写属性名称 – 2014-01-09 21:30:32

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; } 
    ..... 
}