【问题标题】:ViewModel as member of ViewModelViewModel 作为 ViewModel 的成员
【发布时间】:2011-03-30 07:07:51
【问题描述】:

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

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

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

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

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

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

所以。有没有人找到一种干净的 MVVM 兼容方式来做这种事情?

干杯

【问题讨论】:

    标签: mvvm mvvm-light


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨 LunarFrog。我的理解是,Catel 允许您在没有 ViewModels 作为 ViewModels 成员的情况下执行此操作。我很想知道这是否可以用 MVVM Light 来完成。
    • 在内部,Catel 仍然保留一系列 ViewModel 以便能够转发事件。我认为您可以通过引入其他实体(例如 Controller)来模拟它来管理您的虚拟机。
    • 好酷。感谢您的建议。我观看了 DNRTV dnrtv.com/default.aspx?showNum=182 的这一集,其中主持人处于“坏主意”阵营。他使用消息系统在 ViewModel 之间传递值。我正在考虑所有这些东西。我想我不会真正形成自己的观点,直到我有机会参与一个大项目(从痛苦中吸取教训)。
    【解决方案2】:

    我认为 ViewModel 引用其他 ViewModel 没有问题(根据我对 TreeView 的经验)。查看任何有关 TreeView 和 MVVM 的文章。您将看到每个节点都是一个 ViewModel,它引用一组子节点,即 ViewModel。在没有 VM-VM 引用的情况下尝试这样做将是一场噩梦。

    乔什·史密斯 http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

    【讨论】:

    • 谢谢 djeeg。如果乔什·史密斯对这个问题有看法,那我绝对应该注意这一点。今晚我会读它。
    【解决方案3】:

    我一直在使用以下设置:

    具有“集合”虚拟机和“详细信息”虚拟机作为嵌套属性的“主”虚拟机。

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

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

    我看不出这会如何破坏这种模式。

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 2018-11-20
      • 2020-11-25
      • 1970-01-01
      • 2019-04-25
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      相关资源
      最近更新 更多