gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:15:57 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com