我一直在使用MVVM Light Toolkit来帮助学习MVVM模式。但是,我还没能解决控件场景中的用户控件的问题。
例如,在时间表应用程序中,假设我们有一个名为NewUnitOfWork的控件。第一次加载时,带有带有项目列表的ListBox的面板将作为NewUnitOfWork的内容加载。用户点击其中一个。一个新的面板被替换为包含该项目可能的任务的ListBox。选择一个任务并加载一个新面板,该面板将包含用于为所选项目的所选任务输入数据的控件。
因此,我们将一个用户控件中的选定项传递给另外两个用户控件,这两个用户控件依次作为NewUnitOfWork控件(或窗口)的内容进行交换。
如果每个控件都有自己的ViewModel,我们需要将选定的值从一个ViewModel传递到下一个,依此类推。
我使用全局变量让它在单用户情况下工作(通过“服务”)。然而,这也存在并发问题,这不是一个好的解决方案。这是不合格的。
我在这个论坛上多次看到作为另一个ViewModel的成员在ViewModel上的建议。虽然这解决了手头的问题,但我认为它违反了MVVM模式。ViewModel应该直接使用的另一个ViewModel不是与UI相关的功能。
所以。有没有人找到了一种符合MVVM的干净方法来做这类事情?
干杯
发布于 2011-03-30 23:27:11
请始终记住,MVVM只是一种模式,它的设计目的是帮助您分离UI和逻辑。不要害怕“违反模式”,如果它有助于提高应用程序的可测试性或可维护性。
如果您有一个复杂的UI,那么拥有一个包含多个子ViewModel的主ViewModels是非常方便的。主ViewModel可能负责处理顶级UI控件和子VM的协调,而其他ViewModels负责与UI的子区域进行通信。
此外,如果您有一个包含多个嵌套UI层的非常复杂的UI,则可以实现一个基础设施,以自动将所有事件从主VM级联到子VM。当然,您可以尝试使用更高级的MVVM框架之一。例如,Catel实现了相当全面的模型来解决嵌套VM的这种情况。
发布于 2011-03-30 15:13:36
我不认为ViewModels引用其他ViewModels有什么问题(根据我使用TreeViews的经验)。看看任何关于TreeView和MVVM的文章。您将看到每个节点都是一个引用ViewModels子节点集合的ViewModel。在没有VM-VM引用的情况下尝试这样做将是一场噩梦。
乔希·史密斯http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx
发布于 2011-04-01 13:01:29
我一直在使用以下设置:
具有作为嵌套属性的“集合”虚拟机和“详细”虚拟机的“主”虚拟机。
主VM绑定到一个用作主-详细表单的视图。这个主-详细视图由另外两个视图组成。
我发现这是一个非常整洁的设置,因为它允许我在主视图(模型)中放置搜索条件,并保持其他视图(模型)的干净。
我看不出这怎么会打破这种模式。
https://stackoverflow.com/questions/5483042
复制相似问题