Pau*_*mma 5 c# asynchronous mvvm windows-phone-8.1
经过几个小时的搜索,我仍然没有回答这个问题.我已经阅读了关于异步MVVM的这篇精彩文章并使我的viewmodel使用了工厂方法.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说很清楚,但我无法理解如何创建MainViewModel的实例并将其设置为MainPage中的datacontext.我不能简单地写
<Page.DataContext>
<viewModel:MainViewModel/>
</Page.DataContext>
Run Code Online (Sandbox Code Playgroud)
因为我应该使用MainViewModel.CreateAsync() - 方法.我不能在代码隐藏方面做到这一点,我甚至想做,因为代码隐藏 - 构造函数是常规方法,而不是异步方法.那么哪种方法可以继续?
使我的viewmodel使用工厂方法
我通常是这种方法的粉丝 - 这是我最喜欢的解决"无异构构造函数"限制的方法.但是,它在MVVM模式中不能很好地工作.
这是因为从逻辑上讲,VM是您的UI.当用户导航到应用程序中的屏幕时,应用程序需要立即(同步)响应.它不一定要显示任何有用的东西,但它确实需要显示一些东西.因此,VM构造必须是同步的.
因此,不要试图异步构建您的VM,而是首先确定您希望"加载"或"不完整"的UI看起来像什么.您的(同步)VM构造函数应该初始化为该状态,并且它可以启动一些在完成时更新 VM的异步工作.
这不是很难手工完成,或者您可以使用NotifyTaskCompletion我在MSDN文章中描述的异步MVVM数据绑定方法来使用数据绑定来驱动状态转换.