c# - MVVM viewmodel使用async时如何设置datacontext

标签 c# asynchronous mvvm windows-phone-8.1

经过几个小时的搜索,我仍然没有找到这个问题的答案。我读过这个不错 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/

相关文章:

c# - 从 ASP.NET App Pool Identity 运行命令

c# - 读取 excel 但值以不同的格式出现

c# - 在 C# 中清除鼠标缓冲区

javascript - 如何在 popup.html 中异步加载外部 javascript 文件?

c# - 如何避免在不是 ‘top level’ 的事件处理程序中等待任务?

c# - 在Winforms中,从不为任何键触发PreviewKeyDown()

javascript - 当查询返回对象时,Express Mongo 回调返回未定义

c# - WPF MVVM自动GUI测试-代码覆盖率

wpf - 资源字典定位器

c# - 可以将参数传递给 WPF 用户控件吗?