xaml - 将值从父 View 模型传递或获取到 subview 模型?

标签 xaml mvvm nested viewmodel mvvm-light

我正在使用 MVVM Light 框架以及 Unity for DI。我有一些嵌套 View ,每个都绑定(bind)到相应的 ViewModel。 ViewModel 通过 Laurent Bugnion 放入 MVVM Light 的 ViewModelLocator 理念绑定(bind)到每个 View 的根控件 DataContext。这允许通过静态资源查找 ViewModel,并通过依赖注入(inject)框架(在本例中为 Unity)控制 ViewModel 的生命周期。它还允许 Expression Blend 查看与 ViewModel 相关的所有内容以及如何绑定(bind)它们。

正如我所说的, View 有一个健康的嵌套剂量,但 View 模型并不真正了解彼此。父 View 通过静态资源 ViewModelLocator 绑定(bind)到其对应的 ViewModel(它使用 Unity 来控制 ViewModel 对象的构造和生命周期)。该父 View 包含一个用户控件,它是另一个 subview ,然后它也会通过 ViewModelLocator 获取其对应的 ViewModel。 ViewModel 之间没有相互引用,也不知道彼此之间的任何层次结构。

因此,这里有一个 ViewModel 如何通过消息传递进行交互的示例。我有一个父 View ,它有一个 ComboBox 数据绑定(bind)到其 ViewModel 中的 ObservableCollection。 ComboBox 的 SelectedItem 也绑定(bind)(双向)到 ViewModel 上的一个属性。当 ComboBox 的选择发生变化时,这是为了触发其他 View 和子 View 中的更新。目前,我正在通过 MVVM Light 中的消息系统来完成此操作。

所以我想知道从一个 ViewModel 到另一个 ViewModel 获取信息的最佳做法是什么?在这种情况下,我需要传递给子 ViewModel 的基本上是代表当前登录用户的用户 Guid。最顶层的父 View (好吧,ViewModel)会知道这些信息,但我不确定如何将它放到 subview 模型中。

我能想到的一些可能的方法:

  • 子 ViewModel 是否应该询问
    静态资源 ViewModelLocator 用于
    对同一对象的引用
    父 View 正在使用和访问
    属性(property)那样?这好像是
    ViewModels 通过彼此的
    属性(property)不是很干净而且
    将它们不必要地结合在一起。
  • 我已经在使用消息通知
    用户选择的 subview
    组合框中的新项目并
    相应地更新。但对象
    正在选择的类型
    ComboBox 并不是真的直接
    与该数据值相关的
    subview 需要。
  • 最佳答案

    我基本上已经看到了两种方法。对于一般的跨 VM 通信,事件聚合器模式效果很好。

    然而,对于 VM 的层次结构,使用访问者模式可能会更好。通过访问者,您可以获得流经层次结构的信息,例如自动为每个 child 提供对父 VM 的引用。

    您也可以使用 EA 执行此操作,但挑战在于在消息的有效负载中传递足够的信息,以便 children 知道这是他们应该关心的事情。

    至于VM定位器,绝对不是! VM 定位器的内容严格用于在 UI 中绑定(bind),它不应该在该上下文之外出现(最好)。

    我的 $.02
    格伦

    关于xaml - 将值从父 View 模型传递或获取到 subview 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534619/

    相关文章:

    c# - 调度程序计时器错误

    c# - 单独的 View 不从后台 worker Mvvm 更新

    c - C语言中正确使用if/else语句的问题

    inheritance - 为什么我的嵌套 div 不继承父级高度?

    xaml - UWP透明窗口

    c# - 从聚焦的组合框项目中删除虚线边框

    wpf - 可以从 MVVM 中的 View 订阅 ViewModel 的 .NET 事件吗?

    c# - 在不同的 WPF xaml 用户控件中使用资源

    javascript - 在 Immutable.js Map 中查找嵌套对象的最佳方法

    c# - 将 .csv 文件读入 WPF 应用程序 (C#)