c# - Model 应该如何让 ViewModel 知道其状态的变化?

标签 c# mvvm

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

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

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

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

编辑:
我现在已经阅读了,都在 comment from slugsterhere ,让模型有一个状态并不是模型的目的。
然而,在 John Gossman 的原著中 MVVM post ,我们发现:“模型在 MVC 中定义;它是数据或业务逻辑,完全独立于 UI,存储状态并处理问题域。”

最佳答案

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

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

关于c# - Model 应该如何让 ViewModel 知道其状态的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13339459/

相关文章:

c# - mvvm light wpf取消注册

c# - 如何将 UserControl 中的 DependencyProperty 绑定(bind)到 DataContext 属性? Windows 应用商店

c# Mvvm 用来自 GET 请求的数据填充 ObservableObject 属性

wpf - Prism2/MVVM 从 ViewModel 关闭 View

c# - IEnumerable C# 对象到具有名称的数组的 JSON 对象

c# - 如何使用十进制?

c# - IoC 容器 - 单例还是传递实例?

c# - String.Format - 从 C++ 迁移到 C#

c# - 如何使用 DispId 装饰属性(获取和设置?都不是?)

.net - Windows 窗体数据绑定(bind)和属性路径 : how to handle nullability?