经过几个小时的搜索,我仍然没有找到这个问题的答案。我读过这个不错 writing关于异步 MVVM 并使我的 View 模型使用工厂方法。
public class MainViewModel
{
// sic - public, contrary to the pattern in the article I cite
// so I can create it in the Xaml as below
public MainViewModel()
{
}
private async Task InitializeAsync()
{
await DoSomethingAsync();
}
public static async Task<MainViewModel> CreateAsync()
{
var ret = new MainViewModel();
await ret.InitializeAsync();
return ret;
}
}
这对我来说很清楚,但我不明白如何创建 MainViewModel 的实例并将其设置为 MainPage 中的数据上下文。我不能简单地写
<Page.DataContext>
<viewModel:MainViewModel/>
</Page.DataContext>
因为我应该使用 MainViewModel.CreateAsync() 方法。而且我不能在代码隐藏上做到这一点,我什至想这样做,因为代码隐藏构造函数是普通方法,而不是异步方法。那么哪种方式才是正确的继续方式呢?
最佳答案
made my viewmodel to use factory method
我通常是这种方法的粉丝 - 这是我最喜欢的解决“无异步构造函数”限制的方法。但是,它在 MVVM 模式中效果不佳。
这是因为从逻辑上讲,VM 就是您的 UI。当用户导航到应用中的屏幕时,应用需要立即(同步)响应。它不一定必须显示任何有用的东西,但它确实需要显示一些东西。因此,VM 构建必须是同步的。
因此,与其尝试异步构建您的 VM,不如先决定您希望“正在加载”或“不完整”的 UI 看起来像什么。您的(同步)VM 构造函数应初始化为该状态,并且它可以启动一些异步工作,在 VM 完成时更新 VM。
这不是很难手动完成,或者您可以使用我在 MSDN article on async MVVM data binding 中描述的 NotifyTaskCompletion
方法使用数据绑定(bind)驱动状态转换。
关于c# - MVVM viewmodel使用async时如何设置datacontext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681599/