我正在阅读一些关于 MVVM 架构的文章,主要是 这篇和这篇。
我的具体问题是:如何将 Model 的更改通知给 ViewModel?
在 Josh 的文章中,我没有看到他做过这件事。ViewModel 总是向 Model 请求属性。在 Rachel 的示例中,她确实让模型实现了 INotifyPropertyChanged
接口,并从模型触发事件,但它们是供视图本身使用的(有关她为什么这样做的更多细节,请参阅她的文章/代码)。
我没有看到任何例子中, 模型如何向 ViewModel 发出更改模型属性的通知。这让我开始担心,可能由于某种原因不会这样做。 是否有一种模式可以通知 ViewModel 模型的更改? 这似乎是必要的,因为(1)可以想象每个模型可能有不止一个 ViewModel,(2)即使只有一个 ViewModel,对模型的某些操作可能导致其他属性发生变化。
我怀疑可能会有以下回答/评论:"为什么要那样做呢?",因此这里描述一下我的程序。我是 MVVM 的新手,所以也许我的整个设计都有问题。我简要地描述一下它。
我正在编写比 "Customer" 或 "Product" 类更有趣(至少对我来说如此)的东西——21点游戏。
我有一个 View,它没有任何代码,只依赖于 ViewModel 中的属性和命令进行绑定(请参见 Josh Smith 的文章)。
无论是好是坏,我认为模型(Model)不仅应该包含类(如PlayingCard, Deck),而且还应该包括BlackJackGame类,该类维护整个游戏的状态,并知道玩家何时爆牌(bust),庄家必须抽牌,以及玩家和庄家当前的得分情况(小于21,21点,爆牌等)。
我会从BlackJackGame公开一些方法,比如"DrawCard",当抽取一张卡片时,我想更新CardScore和IsBust等属性,并将这些新值传达给ViewModel。或许这种想法是错误的?
有人可能认为ViewModel调用了DrawCard()方法,所以他应该知道要求更新分数并查看自己是否爆牌。你们怎么看?
在我的ViewModel中,我有获取实际扑克牌图像(基于花色和点数)并使其在视图中可用的逻辑。模型不应涉及此事(也许其他ViewModel只使用数字,而不是扑克牌图像)。当然,也许有些人会告诉我,模型甚至不应该有BlackJack游戏的概念,而应该在ViewModel中处理?
OnBust
的事件,虚拟机可以订阅它。我猜你也可以使用IEA方法。 - code4life