1

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

如何处理这种情况?我是否应该允许 AView 直接与 BView 通信,或者如果我这样做我违反了某些规则?

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

4

1 回答 1

1

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

原因包括:组件的自动化测试、功能的完全分离(例如,对于独立模块)、模块的独立团队开发(不会相互绊倒)以及通常更容易弄清楚什么做什么

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

与互连不相关组件的危害相比,发布/侦听额外消息的复杂性微不足道,因此您的最后一个建议是“更好”,但我实际上建议对整个问题采取更简洁的方法:

一些指导方针:

  • 视图不应该知道他们的数据来自哪里,只知道如何显示某种形状的数据。命令执行是通过绑定到 VM 上的 ICommands 来执行的。
  • ViewModel 应该保存某种形式的数据和命令。它应该不知道数据来自哪里或与之绑定的内容。
  • 模型保存实际数据,但不知道它在哪里被使用。
  • 控制器(在 MVVM 中经常被忽略)注册/推送事件,从模型中填充虚拟机,在 ICommands 中设置代码,控制视图的可见性等。控制器是唯一真正需要始终保留在内存中的东西,而且它们非常纤薄(主要是代码和少量数据)。

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

试试这个模式,看看使用大量视图、视图模型和模型变得多么简单。您没有提及您使用的是什么语言或框架,因此我无法对示例提出具体建议。

于 2012-05-10T08:41:01.570 回答