是否允许视图在MVVM中打开另一个视图

是否允许视图在MVVM中打开另一个视图,mvvm,Mvvm,让我们举个例子。我有一个绑定到AViewModel的AView。AView应该在AViewModel上执行一个ACommand,并向其传递一个参数。问题是ViewA没有足够的信息传递给命令,因此需要显示另一个BView,以便从用户处收集信息。关闭VIewB后,ViewA调用AViewModel上的命令,并将参数传递给它 如何处理这种情况?我应该允许AView直接与BView沟通,还是我违反了一些规则 我认为的另一种方法是在AViewModel上调用一个ACommand而不使用参数,然后从VIew

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

如何处理这种情况?我应该允许AView直接与BView沟通,还是我违反了一些规则


我认为的另一种方法是在AViewModel上调用一个ACommand而不使用参数,然后从VIewModelA发送一条消息,说明完成任务需要一个信息。此信息由MainPageViewModel捕获,然后发送打开BView的请求,该视图绑定到BView模型。当BView关闭时,BView模型将发送一条包含其他信息的消息,并且ViewModelA已订阅此类消息,因此它将接收该消息并完成任务。在两个文本框中输入值非常复杂,对吗?:)

MVVM有三条黄金法则:
分离、分离和分离
:)

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

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

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

一些准则:
  • 视图不应该知道数据来自何处,而应该知道如何显示特定形状的数据。命令执行是通过绑定到VM上的ICommands
  • ViewModels应该保存特定形状的数据和命令。它应该不知道数据来自何处,也不知道绑定到它的是什么
  • 模型保存实际数据,但不知道在哪里使用
  • 控制器(在MVVM中经常被忽略)注册/推送事件、从模型填充VM、在ICommands中设置代码、控制视图的可见性等。控制器是始终保留在内存中的唯一实际需要的东西,并且非常小(大部分是代码和少量数据)
基本上,我建议在MVVM模式(MVCVM?)中添加控制器。应用程序/模块创建并初始化控制器。控制器订阅事件并提供应用程序的逻辑


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

MVVM有三条黄金法则:
分离、分离和分离
:)

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

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

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

一些准则:
  • 视图不应该知道数据来自何处,而应该知道如何显示特定形状的数据。命令执行是通过绑定到VM上的ICommands
  • ViewModels应该保存特定形状的数据和命令。它应该不知道数据来自何处,也不知道绑定到它的是什么
  • 模型保存实际数据,但不知道在哪里使用
  • 控制器(在MVVM中经常被忽略)注册/推送事件、从模型填充VM、在ICommands中设置代码、控制视图的可见性等。控制器是始终保留在内存中的唯一实际需要的东西,并且非常小(大部分是代码和少量数据)
基本上,我建议在MVVM模式(MVCVM?)中添加控制器。应用程序/模块创建并初始化控制器。控制器订阅事件并提供应用程序的逻辑


尝试此模式,看看使用大量视图、视图模型和模型会变得多么简单。您没有提到您使用的语言或框架,因此我无法提供具体的建议作为示例。

您好,很抱歉回复太晚,但似乎so不愿意通知我任何回复。:)无论如何,我使用的是c#和MVVMLight框架,所以任何关于什么是控制器的链接都是很好的。我以前从未听说过它们,与MVVM有关。@Goran:我可能得自己写点东西。控制器只是一个包含逻辑的类。初始化时,它订阅与之相关的任何消息。当发生某种情况时(例如,通过它放在ICommand中的代码),它会发布一条消息供其他控制器听到。控制器是应用程序逻辑所属的位置。它使应用程序非常灵活,并且具有良好的关注点分离。与MVVM设计模式所提出的在ViewModel中只包含业务逻辑相比,进一步分离有什么好处?我在VM中发布消息,VM获取数据f