在MVVM模式中,视图中对于其数据上下文(ViewModel)的引用是否有损MVVM模式?

5

假设一个 ViewModel 发布了一个 Event,而使用该 VM 作为其 DataContextView 通过将其 DataContext 强制转换为 VM 实例来订阅该 Event

vm = DataContext as MainViewModel;
if (vm == null) return;
vm.SomeUIRelatedNotice += DoSomethingUIRelated;

我认为,虚拟机仍然保持解耦状态,其可测试性不受任何影响。视图已经引用了虚拟机,所以我并不认为这有任何问题。但是,我想听听 MVVM 纯粹主义者的意见,看是否认为这是对 MVVM 模式的负面影响和不良设计。


在我看来,这完全没有任何问题。WPF数据绑定只是视图对其视图模型上的事件进行连接,只是隐藏在幕后。 - Michael Edenfield
2个回答

3
只要视图模型本身不执行任何视图逻辑,我认为这不违反MVVM模式。在您的情况下,似乎视图模型正在尝试与视图进行交互和指导,因此您可能需要知道有其他方法可以实现此类行为,而这些方法被认为是更纯净的MVVM:

这不是关于特定案例的,而是讨论一般模式的想法... - Dean Kuga
2
我同意。View 已经知道 VM (很可能是为了在它上面指定 'DataTemplate'),因此在仅针对 View 的代码后台引用它并不会有任何问题。这绝对不是理想的方式,但我认为这样做以克服一些 UI 上的限制是无害的。我也同意有更好的方法来处理这个例子,比如使用消息系统。理想情况下,您的 View 不应该控制应用程序流程,例如附加事件到 VM :) - Rachel

2

了解虚拟机的概念并不会有错,就像你提到的那样,很好。

在这种情况下,我问自己的问题是:

“做这个X操作会破坏我的VM可测试性吗?或者会阻碍业务逻辑的可测试性?”

如果答案是“是”- 你可能走错了方向。如果是“否”,那就继续前进吧。在我看来,这就是MVVM的全部内容。它帮助我们单元测试逻辑和类,而以前我们无法使用MVC和紧密耦合之类的东西。

由于您没有对与视图相关的内容进行大量单元测试,因此这不会以任何方式影响您的MVVM“真实性”。

附注

虽然我会坚持我的上述意见。但有一件事是,您考虑过使用Messenger MVVM Light的Messenger的简单教程 / EventAggregator模式吗?使用Messenger模式,您的VM将只发布消息,您的视图可以订阅这些消息而无需引用VM(如果您想要唯一性,则可以使消息类型自定义强类型)。这样,您就不必从DataContext进行转换,也可以很好地单元测试来自VM的消息发布。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接