ViewModel 作为 ViewModel 的成员

one*_*ill 0 mvvm mvvm-light

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

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

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

如果每个控件都有自己的 ViewModel,我们需要将选定的值从一个 ViewModel 传递到下一个等等。

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

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

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

干杯

And*_*ich 5

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

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

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