我正在使用MVVM Light框架以及Unity for DI。我有一些嵌套的视图,每个绑定到相应的ViewModel。 ViewModel通过Laurent Bugnion放入MVVM Light的ViewModelLocator想法绑定到每个View的根控件DataContext。这允许通过静态资源查找ViewModel并通过依赖注入框架来控制ViewModel的生命周期,在这种情况下Unity。它还允许Expression Blend查看有关ViewModel的所有内容以及如何绑定它们。传递或从父ViewModel获取值到Sub-ViewModel?
正如我所说的视图有一个健康的嵌套剂量,但ViewModels并不真正了解彼此的任何事情。父视图通过静态资源ViewModelLocator(使用Unity来控制ViewModel对象的构造和生命周期)绑定到其对应的ViewModel。该父视图在其中包含一个用户控件,该控件是另一个子视图,然后该视图也通过ViewModelLocator获取其对应的ViewModel。 ViewModels不具有彼此的引用,或者彼此之间没有任何层次关系。
因此,下面是ViewModel如何通过消息传递进行交互的示例。我有一个父视图,它有一个ComboBox数据绑定到其ViewModel中的ObservableCollection。 ComboBox的SelectedItem也绑定(双向)到ViewModel上的一个属性。当组合框的选择更改时,这将触发其他视图和子视图中的更新。目前我正通过MVVM Light中的消息系统完成此任务。
所以我想知道最好的做法是从一个ViewModel获取信息到另一个?在这种情况下,我需要传递给sub-ViewModels基本上是一个表示当前登录用户的用户Guid。最顶层的父视图(以及ViewModel)会知道这些信息,但我不确定如何将它放到子视图模型中。
我能想到的一些可能的方案:
如果子视图模型问 静态资源ViewModelLocator为 到 父视图使用同一个对象的引用,并访问 属性,办法?看起来像 ViewModels经历对方的 属性不是很干净, 不必要地将它们连接在一起。
我已经使用短信通知 子视图,用户在ComboBox和 更新相应地选择 一个新的项目。但是在 组合框中选择的对象 类型并不是真正直接与 子视图需要的此数据值相关的 。
实际上,经过身份验证的用户标识不是我需要从顶级ViewModel获得的唯一值; DatePicker控件中还有一个开始日期和结束日期值,需要传递给子ViewModels以过滤一些数据。 – mkmurray 2010-03-30 05:22:07