我的问题是,是否最好在ViewModel构建期间加载数据,还是通过某些Loaded事件处理之后加载数据呢?
我猜答案是通过Loaded事件处理之后加载数据,但是我想知道如何在ViewModel和View之间最清晰地协调这个过程。
以下是关于我的情况和我正在尝试解决的特定问题的更多细节:
我正在使用MVVM Light框架以及Unity进行依赖注入。我有一些嵌套的Views,每个View都绑定到相应的ViewModel。ViewModels通过ViewModelLocator的概念绑定到每个View的根控件DataContext,该概念由Laurent Bugnion放入MVVM Light中。这允许通过静态资源查找ViewModels,并通过Dependency Injection框架(在这种情况下为Unity)控制ViewModels的生命周期。它还允许Expression Blend查看有关ViewModels以及如何绑定它们的所有内容。
所以,我有一个父View,其中有一个ComboBox与其ViewModel中的ObservableCollection数据绑定。ComboBox的SelectedItem也绑定到ViewModel的一个属性(双向)。当ComboBox的选择改变时,这将触发其他视图和子视图的更新。目前,我是通过MVVM Light中的消息系统来实现这一点的。当你在ComboBox中选择不同的项目时,它都可以很好地工作,一切都符合预期。
然而,ViewModel是在构建期间通过一系列初始化方法调用获取其数据的。如果我想控制ComboBox的初始SelectedItem,这似乎只是一个问题。使用MVVM Light的消息系统,我目前已经设置了ViewModel的SelectedItem属性的setter广播更新,并且其他相关的ViewModel在它们的构造函数中注册该消息。目前似乎我正在尝试在ViewModel构建时间通过ViewModel来设置SelectedItem,这导致子ViewModel还未被构造和注册。
如何在ViewModel中协调数据加载和初始化SelectedItem的最佳方式?我希望尽可能少地将代码放入View的code-behind。我认为我只需要一种方式让ViewModel知道何时已加载内容,以便它可以继续加载数据并完成设置阶段。
提前感谢您的回复。