4

我正在构建和 MVVM 应用程序,其中我的一些模型包含他们正在建模的真实世界对象的状态。状态因外部事件而改变,例如,我的模型通过 TCP/IP 获取有关股票变化的信息,并更新其状态以反映该变化。

现在我希望将更改传播到我的视图,而这样做的方法是让我的 ViewModel 知道更改。我可以想到两种方法来做到这一点。

,我让Model实现INotifyPropertyChanged,当属性改变时触发事件。但是,由于某种原因,这似乎不受欢迎。
第二,我为模型中可以更改的每个属性实现一个事件,ViewModel 可以显式绑定到的事件。

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

编辑:
我现在已经在slugsterhere的评论中读到,让模型具有状态不是模型的目的。
然而,在 John Gossman 的原始MVVM 帖子中,我们发现:“模型在 MVC 中定义;它是完全独立于 UI 的数据或业务逻辑,用于存储状态并处理问题域。”

4

4 回答 4

1

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

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

于 2012-11-15T13:18:22.157 回答
1

模型类通常通过INotifyPropertyChangedINotifyCollectionChanged接口提供属性和集合更改通知事件。这使它们可以轻松地在视图中绑定数据。表示对象集合的模型类通常派生自ObservableCollection类。

MSDN

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

接着?

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

如果您只想对更改的属性做出反应,只需使用INotifyPropertyChanged,因为这就是它的用途。在ViewModel中,只需订阅Model的PropertyChanged事件并处理更改,这基本上只是“将它们向前映射”,即为 ViewModel 属性引发PropertChanged 模型属性更改的影响。

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

我希望这有帮助。

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

于 2012-11-12T09:43:12.227 回答
1

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

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

于 2012-11-12T07:06:41.377 回答
-1

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

数据绑定概述

于 2012-11-12T07:05:22.497 回答