在MVVM中,ViewModel或Model应该实现INotifyPropertyChanged吗?
在MVVM中,ViewModel或Model应该实现INotifyPropertyChanged吗?
我已经学习了许多MVVM的例子,其中大部分都有Model实现INotifyPropertyChanged
,但是在Josh Smith的CommandSink例子中,ViewModel实现了INotifyPropertyChanged
。
我正在认真理解MVVM的概念,所以我不知道:
- 你是否必须将
INotifyPropertyChanged
放在ViewModel中,才能让CommandSink
工作。 - 这是否只是规则的异变,它实际上并不重要。
- 你是否应该让Model实现
INotifyPropertyChanged
,这只是一个错误,如果这个例子从代码应用变成应用程序,那么它就会被纠正。
在你参与的MVVM项目中,你有什么经验可以分享呢?
我非常不同意模型不应该实现 INotifyPropertyChanged
的概念。这个接口不是特定于UI的!它只是通知发生了变化。的确,WPF在很大程度上使用它来识别变化,但这并不意味着它是一个UI接口。我会将它与以下评论进行比较:“轮胎是汽车配件”。当然是,但是自行车、公共汽车等也使用它。总之,不要把这个接口看作是UI的东西。
话虽如此,并不意味着我认为模型必须提供通知。实际上,通常情况下,模型不应该实现这个接口,除非有必要。在大多数情况下,如果没有服务器数据被推送到客户端应用程序,模型可能会过时。但是,如果监听金融市场数据,那么我不明白为什么模型不能实现这个接口。例如,如果我有非UI逻辑,比如一个服务,在收到给定值的“买入”或“卖出”价格时,它会发出警报(例如通过电子邮件)或下订单,这可能是一个可能的干净解决方案。
然而,有不同的实现方式,但我总是倾向于简单,避免冗余。
什么更好?在集合上定义事件还是在视图模型上定义属性更改,并将其传递到模型中,还是让视图通过视图模型自动更新模型?
无论何时当你看到有人声称“你不能做这个或那个”,这表明他们不知道在谈论什么。
实际上,这取决于你的情况,事实上MVVM是一个有很多问题的框架,我还没有看到一个普遍的MVVM实现。
我希望我有更多时间来解释MVVM的许多变化和一些常见问题的解决方案-主要由其他开发人员提供,但我想我将不得不再做一次。