假设ViewModel
发布了Event
和View
正在使用该虚拟机,DataContext
通过获取对Event
的{{1}}订阅VM将DataContext
强制转换为VM实例:
vm = DataContext as MainViewModel;
if (vm == null) return;
vm.SomeUIRelatedNotice += DoSomethingUIRelated;
我看到这种方式,虚拟机仍然是分离的,其可测试性不会受到影响,并且View已经有对VM的引用,所以我看到没有任何问题,但我想听听MVVM纯粹主义者如果他们认为这是糟糕的设计,对MVVM模式有负面影响,那么为什么呢?
答案 0 :(得分:3)
只要视图模型本身没有执行任何视图逻辑,我就不会认为这会破坏MVVM模式。
看起来在你的情况下,视图模型试图以某种方式交互并指导视图,所以你应该知道还有其他方法来实现这种被认为是更纯粹的MVVM的行为:
Messenger
service EventAggregator
或其interaction patterns 答案 1 :(得分:2)
查看知道虚拟机没有错,就像你提到的那样完全没问题。
在这种情况下,我问自己的问题是
“执行此X操作会使我的VM中断可测试性吗?还是会妨碍我的业务逻辑中的可测试性范围?”
如果回答是“是” - 你正走在错误的道路上。如果“否”就在前方。在我看来,这就是MVVM的全部内容。它可以帮助您对测试逻辑和类进行单元化,而这些逻辑和类之前我们无法使用MVC和紧耦合等。
由于你不在很大程度上对视图相关的东西进行单元测试,这不会以任何方式影响你的MVVM“真实性”。
<强>侧面注意
虽然我会坚持我的上述观点。有一件事是,您是否考虑使用Messenger
Simple Tutorial of MVVM Light's Messenger / EventAggregator
模式。使用Messenger
模式,您的VM将只发布消息,而您的视图基本上只需订阅这些消息,甚至无需引用VM(如果您想要唯一性,请使消息类型自定义为强)。这样您就不必从DataContext
进行整个转换,也可以完全正确地测试从VM发布的消息。