View / ViewModel循环依赖引用是否合适?

时间:2014-01-20 21:11:54

标签: design-patterns mvvm

我正在阅读Mark Seeman的书“.NET中的依赖注入”。在其中,他描述了一个适配器类型,用于为视图提供适当的视图模型,但在相同的上下文中还提到使视图模型知道视图(尽管像IWindow之类的东西)来“控制其窗口环境,例如显示模态对话框。“

根据我的经验,这是对MVVM设计的一个非平凡的破坏,甚至可能是一个糟糕的DI解决方案。大多数这些“需求”通常能够通过DataTriggers,第三方服务,中介模式以及在某些情况下普通的旧clr事件的组合来表达。 (值得注意的是,许多人更喜欢通过IObserver注入暴露类似事件的ViewModel元素。Mark Seeman even blogged on this!

因此我问这个问题:“无论框架,技术,语言,堆栈或工具集如何。如果MVVM可以实现,是否(应该有)任何理由视图模型需要意识到查看?“

跟进相关问题:“由于严格执行模式的复杂性,是否有理由忽视此指南?”

1 个答案:

答案 0 :(得分:3)

  

无论框架,技术,语言,堆栈或工具集如何。如果   MVVM可以实现,是否(应该有)任何原因   视图模型需要了解视图吗?

ViewModel是View的模型,而不是相反的模型,因此ViewModel中的View不应该有任何意识(直接或通过接口)。我唯一一次看到ViewModel应该让我们知道View,这是因为糟糕的设计。

  

是否有理由忽视此指导原因   严格执行模式的复杂性?

我认为没有。

许多ViewModel看起来好像开发人员在代码隐藏中首先完成了所有操作,然后将所有代码隐藏逻辑移到一个单独的类中,并将其称为ViewModel。你会看到那里的东西,比如打开弹出窗口或决定某个控件应该有多宽。

我认为这不是从MVVM中获得最大收益的方法。 UI逻辑将始终链接到View。如果您使用WPF或Silverlight,则很难摆脱代码隐藏中的所有代码。

E.g。显示模态对话框不是ViewModel的责任,它是决定如何表示某个条件/事件的UI。条件/事件可以在ViewModel中找到,但对此的更改将由View处理。