模型应该如何让ViewModel了解其状态的变化?

时间:2012-11-12 06:56:25

标签: c# mvvm

我正在构建和MVVM应用程序,其中我的一些模型包含他们正在建模的realworld-object状态。国家从外部事件变化,例如我的模型通过TCP / IP获取有关更改的库存的信息,并更新其状态以反映该更改。

现在我希望将更改传播到我的View,并且这样做的方法是让我的ViewModel了解更改。 我可以想到两种方法。

一个,我让Model实现INotifyPropertyChanged,并在属性更改时触发事件。但是,出于某种原因,这似乎是frowned upon 两个,我为每个可以在模型中更改的属性实现一个事件,ViewModel显式可以绑定的事件。

首选方式是什么?还有其他方法(更好的方法)吗?

修改
我现在已经在comment from slugsterhere中读到,模型具有状态不是模型的目的。
但是,在John Gossmans的原始MVVM post中,我们发现:“模型定义为MVC;它是数据或业务逻辑,完全独立于UI,存储状态并处理问题域。“

4 个答案:

答案 0 :(得分:1)

选项2是可行的,虽然很脏。您可以通过接口公开公共事件和函数来稍微减轻肮脏,并且视图模型仅通过该接口使用模型。

话虽如此,该模型应被视为信息管道,而不是信息容器。这意味着理想情况下,您的模型不应包含任何状态信息。如果你的模型中有持久开放的通道需要在收到某些内容时通知其他组件,那么我建议你在Prism中使用EventAggregator - 这是一个弱事件发布/子系统,你的viewmodel可以订阅您选择的事件,您的模型可以在需要时(以及适当的有效负载)发布该事件。

答案 1 :(得分:1)

  

模型类通常提供属性和集合更改   通过 INotifyPropertyChanged 和通知事件    INotifyCollectionChanged 接口。这使他们很容易   视图中绑定的数据。表示集合的模型类   对象通常来自 ObservableCollection 类。

MSDN

我不会说Model 通常实现了INotifyPropertyChanged,但我不会断然拒绝这样做。在更简单 - 非PRISM环境中,我认为它完全没问题。

然后呢?

澄清: INotifyPropertyChanged 是一个属性更改时通知的界面,正如名称所示并且大多数人都知道。但是,它不仅仅是这个,尤其是不是WPF特定的!此外,根据MVVM原则, Model 应该与 ViewModel 无关。因此,很明显,您应该使用发布者(模型) - 订阅者( ViewModel ) - 模式(事件)。就这样。因此,作为您的问题的答案:如何在Model / ViewModel之间建立通信取决于您的风格和具体任务:

如果您只是想对已更改的属性做出反应,只需使用 INotifyPropertyChanged ,就像它的用途一样。在 ViewModel 中,只需订阅 Model PropertyChanged - 事件并处理更改,这基本上就是“向前映射”,为 ViewModel -property提升 PropertChanged ,这是由模型属性的更改所影响的。

或者,如果您需要在更具体的事件中包装模型更改,请说“ MyDataUpdated ”,那么我也没有看到任何问题。只需在ViewModel中监听此事件,并根据需要进行处理。这完全没问题。

我希望这会有所帮助。

编辑:作为旁注:我建议使用 PropertyWeaver 扩展程序,这样就不会使用所有PropertyChanged内容弄乱你的模型。

答案 2 :(得分:1)

我将使用option1。在viewmodel中保留对模型的引用,但不要直接使用任何属性。而是从模型中填充viewmodel自己的属性。您的视图模型可以从模型中侦听相关属性的属性更改通知,并从模型中重新填充其自己的属性。该模型仍然是独立于UI的,它只是通知属性已更改。

在我看来,除了inotifypropertychanged之外,做自己的发布者 - 订阅者逻辑可能只是一种矫枉过正,因为可能没有任何好处。但是,这取决于您是否能够在视图模型中使用模型参考,而我的答案基于您可以在视图模型中引用模型的假设

答案 3 :(得分:-1)

对于数据绑定,您可以使用 **绑定**

Data Binding Overview