应该允许View在MVVM中打开另一个View

时间:2012-05-09 00:48:36

标签: mvvm

让我们举个例子。我有一个绑定到AViewModel的AView。 AView应该在AViewModel上执行ACommand,并传递一个参数。问题是ViewA没有足够的信息传递给命令,因此需要显示另一个BView,以便从用户收集信息。在VIewB关闭后,ViewA在AViewModel上调用ACommand,并将参数传递给它。

如何处理这种情况?我应该允许AView直接与BView通信,或者如果我这样做,我会破坏一些规则吗?

我想的另一种方法是在没有参数的情况下在AViewModel上调用ACommand,然后从VIewModelA发送消息,表明需要信息来完成任务。 MainPageViewModel捕获此信息,而不是发送打开BView的请求,BView绑定到BViewModel。当BView关闭时,BVIewModel发送带有附加信息的消息,并且ViewModelA订阅了这种类型的消息,因此它接收它并完成任务。只是在两个文本框中输入值非常复杂,对吧? :)

1 个答案:

答案 0 :(得分:1)

MVVM有三条黄金法则:Separation, Separation & Separation:)

原因包括:组件的自动化测试,功能的完全分离(例如独立模块),模块的独立团队开发(不会互相绊倒),通常只是更容易找出什么是

回答您的两个视图互连:您正在添加不应存在的依赖项。关注点的分离比一点复杂性更重要(我认为消息传递模型比维护直接互连更简单。)

发布/收听额外消息的复杂性与互连不相关组件的危害相比无关紧要,因此您的上一个建议“更好”,但我实际上建议对整个问题采取更清晰的方法:

一些指导原则:

  • 视图不应该知道他们的数据来自何处,只知道如何显示某种形状的数据。命令执行是通过绑定到VM上的ICommands。
  • ViewModels应该包含某种形状的数据和命令。它应该不知道数据来自何处或者绑定到它的内容。
  • 模型保存实际数据,但不知道它在哪里消耗。
  • 控制器(在MVVM中经常被忽略)注册/推送事件,从模型中填充VM,在ICommands中设置代码,控制视图的可见性等。控制器是实际需要始终保持在内存中的唯一东西,它们是相当的苗条(主要是代码和小数据)。

基本上我建议将控制器添加到MVVM模式(MVCVM?)。应用程序/模块创建和初始化控制器。控制器订阅事件并提供应用程序的逻辑。

尝试这种模式,看看使用大量的Views,ViewModel和Models是多么简单。 您没有提及您使用的语言或框架,因此我无法针对示例提出具体建议。