我的一般问题是如标题所述,最好在 ViewModel 构建期间或之后通过一些 Loaded 事件处理加载数据?
我猜答案是在通过一些 Loaded 事件处理构建之后,但我想知道 ViewModel 和 View 之间如何最干净地协调?
以下是有关我的情况和我要解决的特定问题的更多详细信息:
我正在使用 MVVM Light 框架以及 Unity for DI。我有一些嵌套视图,每个都绑定到相应的 ViewModel。ViewModel 通过 Laurent Bugnion 放入 MVVM Light 的 ViewModelLocator 理念绑定到每个 View 的根控件 DataContext。这允许通过静态资源查找 ViewModel 并通过依赖注入框架(在本例中为 Unity)控制 ViewModel 的生命周期。它还允许 Expression Blend 查看与 ViewModel 相关的所有内容以及如何绑定它们。
所以无论如何,我有一个父视图,它有一个 ComboBox 数据绑定到其 ViewModel 中的 ObservableCollection。ComboBox 的 SelectedItem 也绑定(双向)到 ViewModel 上的一个属性。当 ComboBox 的选择发生变化时,这是为了触发其他视图和子视图中的更新。目前,我正在通过 MVVM Light 中的消息系统来完成此操作。当您在 ComboBox 中选择不同的项目时,这一切都很好,并且符合预期。
但是,ViewModel 在构建期间通过一系列初始化方法调用获取其数据。如果我想控制 ComboBox 的初始 SelectedItem 是什么,这似乎只是一个问题。使用 MVVM Light 的消息传递系统,我目前已将其设置为 ViewModel 的 SelectedItem 属性的设置器是广播更新的设置器,而其他感兴趣的 ViewModels 在其构造函数中注册消息。看来我目前正在尝试在构建时通过 ViewModel 设置 SelectedItem,这还不允许构建和注册子 ViewModel。
在 ViewModel 中协调 SelectedItem 的数据加载和初始设置的最简洁方法是什么?我真的很想坚持尽可能少地在 View 的代码隐藏中添加合理的内容。我想我只需要一种方法让 ViewModel 知道什么时候加载了东西,然后它可以继续加载数据并完成设置阶段。
提前感谢您的回复。