MVVM如何在viewmodel使用async时设置datacontext

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() - 方法.我不能在代码隐藏方面做到这一点,我甚至想做,因为代码隐藏 - 构造函数是常规方法,而不是异步方法.那么哪种方法可以继续?

Ste*_*ary 6

使我的viewmodel使用工厂方法

我通常是这种方法的粉丝 - 这是我最喜欢的解决"无异构构造函数"限制的方法.但是,它在MVVM模式中不能很好地工作.

这是因为从逻辑上讲,VM是您的UI.当用户导航到应用程序中的屏幕时,应用程序需要立即(同步)响应.它不一定要显示任何有用的东西,但它确实需要显示一些东西.因此,VM构造必须是同步的.

因此,不要试图异步构建您的VM,而是首先确定您希望"加载"或"不完整"的UI看起来像什么.您的(同步)VM构造函数应该初始化为该状态,并且它可以启动一些在完成时更新 VM的异步工作.

这不是很难手工完成,或者您可以使用NotifyTaskCompletion我在MSDN文章中描述的异步MVVM数据绑定方法来使用数据绑定来驱动状态转换.