2011-03-30 52 views
0

我一直在使用MVVM Light Toolkit来帮助学习MVVM模式。但是,我无法解决控件场景中的用户控件问题。ViewModel作为ViewModel的成员

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

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

如果每个控件都有自己的视图模型,我们需要选择的值传递从一个视图模型到下等

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

我已经看到很多次这个论坛上的建议有ViewModel作为另一个ViewModel的成员。虽然这解决了手头的问题,但我认为这违反了MVVM模式。另一个ViewModel不是ViewModel直接支持的与UI相关的功能。

所以。有没有人发现一个干净的MVVM遵守方式做这种事情?

干杯

回答

3

请永远记住,MVVM只是一个模式,它旨在帮助你分开你的用户界面和逻辑。如果有助于提高应用程序的可测试性或可维护性,不要害怕“违反模式”。

如果您有复杂的用户界面,拥有带有多个子ViewModel的主ViewModel非常方便。主ViewModel可能负责处理顶级UI控件和协调子VM,而其他ViewModel则负责与UI的子区域进行通信。此外,如果您的UI具有多个嵌套UI层,那么您可以实施一个基础结构,以自动将所有事件从主虚拟机级联到子虚拟机。 因此,您可能会尝试使用更高级的MVVM框架之一。例如Catel实现了非常全面的模型来解决嵌套虚拟机的这种情况。

+0

嗨LunarFrog。我的理解是,Catel允许您在不将ViewModel作为ViewModel的成员的情况下执行此操作。我很好奇,看看MVVM Light是否可以做到这一点。 – onefootswill 2011-03-31 00:09:12

+0

内部Catel仍然保持一系列ViewModel能够转发事件。我想你可以通过引入额外的实体来模拟它,比如Controller,来管理你的虚拟机。 – 2011-03-31 20:35:00

+0

好酷。感谢您的建议。我观看了DNRTV的这一集,其中主持人是在“坏主意”阵营。他使用消息系统在ViewModels之间传递值。我正在考虑所有这些东西。我想我不会真正形成我自己的观点,直到我有机会与它一起开展一个大项目(从痛苦中吸取教训)。 – onefootswill 2011-04-01 00:52:50

2

我没有看到的ViewModels引用其它的ViewModels问题(根据我的TreeView经验)。看看有关TreeView和MVVM的任何文章。您会看到每个节点都是一个ViewModel,它引用了一系列ViewModel子节点。试图在没有VM-VM引用的情况下这样做会是一场噩梦。

约什 - 史密斯 http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

+0

谢谢djeeg。如果乔什史密斯对这个问题有看法,那么我应该注意这一点。我今晚会读它。 – onefootswill 2011-04-01 00:49:44

1

我已经使用以下设置:

A '主' VM以 '集合' VM和 '细节' VM为嵌套属性。

主虚拟机绑定到用作主 - 明细表单的视图。该主视图由两个其他视图组成。

我觉得它非常整洁,因为它允许我在主视图(模型)中放置搜索条件并保持其他视图(模型)的清洁。

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