Mvvm ViewModel作为ViewModel的成员

Mvvm ViewModel作为ViewModel的成员,mvvm,mvvm-light,Mvvm,Mvvm Light,我一直在使用MVVM Light工具包来帮助学习MVVM模式。然而,我还不能在控制场景中解决用户控制的问题 例如,在时间表应用程序中,假设我们有一个名为NewUnitOfWork的控件。第一次加载时,带有项目列表的列表框的面板将作为NewUnitOfWork的内容加载。用户点击其中一个。新面板与包含该项目可能任务的列表框交换。选择一个任务并加载一个新面板,该面板将包含用于为所选项目的所选任务输入数据的控件 因此,我们将一个usercontrol中的选定项传递给另外两个用户控件,这两个控件又作为N

我一直在使用MVVM Light工具包来帮助学习MVVM模式。然而,我还不能在控制场景中解决用户控制的问题

例如,在时间表应用程序中,假设我们有一个名为NewUnitOfWork的控件。第一次加载时,带有项目列表的列表框的面板将作为NewUnitOfWork的内容加载。用户点击其中一个。新面板与包含该项目可能任务的列表框交换。选择一个任务并加载一个新面板,该面板将包含用于为所选项目的所选任务输入数据的控件

因此,我们将一个usercontrol中的选定项传递给另外两个用户控件,这两个控件又作为NewUnitOfWork控件(或窗口)的内容交换

如果每个控件都有自己的ViewModel,则需要将选定的值从一个ViewModel传递到下一个ViewModel,以此类推

我使用全局变量(通过“服务”)在单用户情况下使其工作。但是,这存在并发性问题,这不是一个好的解决方案。这是低于标准的

我曾多次在本论坛上看到关于将ViewModel作为另一个ViewModel成员的建议。虽然这解决了手头的问题,但我认为这违反了MVVM模式。另一个ViewModel不是ViewModel应该直接使用的UI相关功能

所以。有没有人找到一个干净的符合MVVM的方法来做这类事情


干杯

我认为ViewModels引用其他ViewModels没有问题(基于我使用TreeView的经验)。看看任何关于TreeView和MVVM的文章。您将看到每个节点都是一个ViewModel,它引用了子节点的集合,这些子节点是ViewModels。在没有VM-VM引用的情况下尝试这样做将是一场噩梦

乔希·史密斯

请始终记住,MVVM只是一种模式,旨在帮助您分离UI和逻辑。如果有助于提高应用程序的可测试性或可维护性,不要害怕“违反模式”

如果您有一个复杂的UI,那么拥有一个带有多个子ViewModel的主ViewModel非常方便。主视图模型可能负责处理顶级UI控件和协调子VM,而其他视图模型则负责与UI的子区域通信

此外,如果您有一个具有多个嵌套UI层的非常复杂的UI,那么您可以实现一个基础结构,以自动将所有事件从主VM级联到子VM。
当然,您可以尝试使用一种更高级的MVVM框架。例如,实现相当全面的模型来解决嵌套VM的这种情况。

我一直在使用以下设置:

“主”虚拟机,其中“集合”虚拟机和“详细信息”虚拟机作为嵌套属性

主VM绑定到用作主详细信息表单的视图。此主详细视图由其他两个视图组成

我发现这是一个非常整洁的设置,因为它允许我在主视图(模型)中放置搜索条件,并保持其他视图(模型)的整洁


我看不出这将如何打破这种模式。

嗨,LunarFrog。我的理解是Catel允许您在不使用ViewModels作为ViewModels成员的情况下执行此操作。我很好奇是否可以用MVVM Light实现这一点。Catel内部仍保留一系列ViewModels,以便能够转发事件。我认为您可以通过引入额外的实体(比如控制器)来模拟它来管理您的虚拟机。谢谢你的建议。我看了DNRTV的这一集,在这一集中,主持人处于“坏主意”阵营。他使用消息系统在视图模型之间传递值。我把这些都考虑进去了。我想我不会真正形成自己的观点,除非我有机会用它做一个大项目(从痛苦中吸取教训)。谢谢。如果乔希·史密斯对这个问题有自己的看法,那么我肯定会注意到这一点。我今晚读。