是View中的一个ViewModel(它的DataContext)以任何方式对MVVM模式有害吗?

时间:2014-01-24 21:04:22

标签: wpf design-patterns mvvm

假设ViewModel发布了EventView正在使用该虚拟机,DataContext通过获取对Event的{​​{1}}订阅VM将DataContext强制转换为VM实例:

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

我看到这种方式,虚拟机仍然是分离的,其可测试性不会受到影响,并且View已经有对VM的引用,所以我看到没有任何问题,但我想听听MVVM纯粹主义者如果他们认为这是糟糕的设计,对MVVM模式有负面影响,那么为什么呢?

2 个答案:

答案 0 :(得分:3)

只要视图模型本身没有执行任何视图逻辑,我就不会认为这会破坏MVVM模式。

看起来在你的情况下,视图模型试图以某种方式交互并指导视图,所以你应该知道还有其他方法来实现这种被认为是更纯粹的MVVM的行为:

答案 1 :(得分:2)

查看知道虚拟机没有错,就像你提到的那样完全没问题。

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

“执行此X操作会使我的VM中断可测试性吗?还是会妨碍我的业务逻辑中的可测试性范围?”

如果回答是“是” - 你正走在错误的道路上。如果“否”就在前方。在我看来,这就是MVVM的全部内容。它可以帮助您对测试逻辑和类进行单元化,而这些逻辑和类之前我们无法使用MVC和紧耦合等。

由于你不在很大程度上对视图相关的东西进行单元测试,这不会以任何方式影响你的MVVM“真实性”。

<强>侧面注意

虽然我会坚持我的上述观点。有一件事是,您是否考虑使用Messenger Simple Tutorial of MVVM Light's Messenger / EventAggregator模式。使用Messenger模式,您的VM将只发布消息,而您的视图基本上只需订阅这些消息,甚至无需引用VM(如果您想要唯一性,请使消息类型自定义为强)。这样您就不必从DataContext进行整个转换,也可以完全正确地测试从VM发布的消息。