我正在使用 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 请求对父 View 正在使用的同一对象的引用并以这种方式访问该属性?似乎 ViewModel 遍历彼此的属性不是很干净,并且不必要地将它们耦合在一起。
我已经在使用消息来通知子视图用户在 ComboBox 中选择了一个新项目并进行相应更新。但在 ComboBox 中选择的对象类型与子视图所需的数据值并没有真正直接的关系。