为什么MVVM Light中没有PropertyChanged的简写

Who*_*nja 0 .net mvvm mvvm-light

每当我们在setter中调用PropertyChanged时MVVM Light中没有简写,就像在flex [Bindable]中一样:

[PropertyChanged]
public bool IsEditable { .... }
Run Code Online (Sandbox Code Playgroud)

为什么我们每次都要写PropertyChanged("IsEditable"),它容易出错,哪些可以默认.

LBu*_*ion 7

我决定不把它添加到MVVM Light,因为解决方案涉及反射(减慢性能)或IL编织(这是"魔术",因此违背了MVVM Light的原则,这将是轻松和易于理解.

为了"对抗"你提到的问题,我在MVVM Light中有三个工具:

  • 代码段自动创建"可绑定"属性.只需键入mvvminpc,然后展开代码段即可.这是避免编写代码的简单方法.
  • "魔术字符串"在VM类上声明为公共const字符串.这样你就可以避免拼写错误.
  • 在调试时,ViewModelBase类会在调用RaisePropertyChange时自动检查VM类上是否存在属性名称.这会在开发游戏的早期发现错别字.

有了这三个工具,我的评价就是不需要其他机制.但是,根据大众需求,我将使用lambda表达式(例如RaisePropertyChanged(vm => vm.MyProperty))添加一种方法来使用RaisePropertyChanged.当然,如果你不想拥有这意味着的性能,那么这将是可选的.

此外,今年我一直在与有影响力的人士(包括Anders Heljsberg)进行讨论,并强调在框架中(或甚至在语言中)将其融入其中会很好.这将是最稳定的解决方案(因为MSFT可以对此进行优化),但这显然需要时间(如果它发生的话).

干杯,洛朗


Aar*_*ver 5

您可以创建强类型的INotifyPropertyChanged行为.这将允许你做一些像......

RaiseChanged(() => this.PropertyName);
Run Code Online (Sandbox Code Playgroud)