【发布时间】:2011-02-01 20:09:25
【问题描述】:
我正在使用 MVVM Light 框架以及 Unity for DI。我有一些嵌套视图,每个都绑定到相应的 ViewModel。 ViewModel 通过 Laurent Bugnion 放入 MVVM Light 的 ViewModelLocator 想法绑定到每个 View 的根控件 DataContext。这允许通过静态资源查找 ViewModel,并通过依赖注入框架(在本例中为 Unity)控制 ViewModel 的生命周期。它还允许 Expression Blend 查看与 ViewModel 相关的所有内容以及如何绑定它们。
正如我所说的,视图有一个健康的嵌套剂量,但视图模型并不真正了解彼此。父视图通过静态资源 ViewModelLocator 绑定到其对应的 ViewModel(它使用 Unity 来控制 ViewModel 对象的构造和生命周期)。该父视图包含一个用户控件,它是另一个子视图,然后它也会通过 ViewModelLocator 获取其对应的 ViewModel。 ViewModel 之间没有相互引用,也不知道彼此之间的任何层次结构。
下面是一个 ViewModel 如何通过消息传递进行交互的示例。我有一个父视图,它有一个 ComboBox 数据绑定到其 ViewModel 中的 ObservableCollection。 ComboBox 的 SelectedItem 也绑定(双向)到 ViewModel 上的属性。当 ComboBox 的选择发生变化时,这是为了触发其他 View 和子 View 中的更新。目前,我正在通过 MVVM Light 中的消息系统完成此操作。
所以我想知道从一个 ViewModel 到另一个 ViewModel 获取信息的最佳做法是什么?在这种情况下,我需要传递给子 ViewModels 的基本上是代表当前登录用户的用户 Guid。最顶层的父视图(好吧,ViewModel)会知道这些信息,但我不知道如何将它放到子视图模型中。
我能想到的一些可能的方法:
子 ViewModel 是否应该询问 静态资源 ViewModelLocator 用于 对同一对象的引用 父视图正在使用和访问 财产那样?这好像是 ViewModels 通过彼此的 物业不是很干净而且 将它们不必要地耦合在一起。
我已经在使用消息来通知 用户选择的子视图 组合框中的新项目并 相应地更新。但对象 正在选择的类型 ComboBox 并不是真的直接 与该数据值相关的 子视图需要。
【问题讨论】:
-
实际上,经过身份验证的用户 ID 并不是我需要从最顶层的 ViewModel 获得的唯一值;还有一个来自 DatePicker 控件的开始和结束日期值,需要向下传递子 ViewModel 以过滤一些数据。
标签: xaml mvvm nested viewmodel mvvm-light