我一直在使用MVVM Light Toolkit来帮助学习MVVM模式。但是,我无法在控制方案中解决用户控制问题。
例如,在Timesheet应用程序中,假设我们有一个名为NewUnitOfWork的控件。首次加载时,带有带有项目列表的ListBox的面板将作为NewUnitOfWork的内容加载。用户点击一个。使用包含该项目可能任务的ListBox交换新面板。选择一个任务并加载一个新面板,其中包含用于为所选项目的所选任务输入数据的控件。
因此,我们将一个usercontrol中的选定项目传递给另外两个用户控件,这些控件又作为NewUnitOfWork控件(或窗口)的内容进行交换。
如果每个控件都有自己的ViewModel,我们需要将选定的值从一个ViewModel传递给下一个等。
我使用全局变量(通过“服务”)在单个用户环境中工作。但是,存在并发性问题,并不是一个好的解决方案。它低于标准杆。
我已多次看到此论坛上的建议将ViewModel作为另一个ViewModel的成员。虽然这解决了手头的问题,但我认为这违反了MVVM模式。另一个ViewModel不是ViewModel直接与UI相关的功能。
因此。有没有人找到一种干净的MVVM兼容方式来做这类事情?
干杯
答案 0 :(得分:3)
请始终牢记MVVM只是一种模式,它旨在帮助您分离UI和逻辑。如果它有助于提高应用程序的可测试性或可维护性,请不要害怕“违反模式”。
如果您拥有复杂的UI,拥有一个包含多个子ViewModel的主ViewModel非常方便。主ViewModel可能负责处理顶级UI控件和协调子VM,而其他ViewModel负责与UI的子区域进行通信。
此外,如果您具有多个嵌套UI层的非常复杂的UI,则可以实施基础架构以自动将所有事件从主VM迁移到子VM。 原因是,您可以尝试使用一种更高级的MVVM框架。例如,Catel实现了非常全面的模型来解决嵌套虚拟机的这种情况。
答案 1 :(得分:2)
我没有看到ViewModels引用其他ViewModel的问题(基于我对TreeViews的体验)。看看有关TreeView和MVVM的任何文章。您将看到每个节点都是一个ViewModel,它引用一组子节点,即ViewModel。在没有VM-VM引用的情况下尝试这样做将是一场噩梦。
乔什史密斯 http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx答案 2 :(得分:1)
我一直在使用以下设置:
具有“集合”VM和“详细信息”VM作为嵌套属性的“主”VM。
主VM绑定到用作主 - 详细信息表单的View。此主 - 详细视图由另外两个视图组成。
我发现这是一个非常简洁的设置,因为它允许我将搜索条件放在主视图(模型)中,并保持其他视图(模型)清洁。
我看不出这会如何打破这种模式。