Cv-MvvmCross ShowViewModel加载顺序

我的ViewModel中有一个排序问题,该问题似乎与线程有关,但我无法弄清楚我们出了什么问题或我的“修复”是如何修复它的.

我有一个ViewModel,需要调用一个异步方法来加载其初始数据.我从MvvmCross自动调用的Init方法调用异步方法.如果由于某种原因加载失败,我想显示一个Error屏幕,但是在Init调用的方法内部调用ShowViewModel不会产生预期的结果. ShowViewModel的调用正确,但是在调试器中跟随它执行操作时,似乎ErrorViewModel在原始ViewModel / View完成加载之前显示-因此它加载但没有出现,因为它已被原始ViewModel覆盖.

这是加载代码的简化版本:

public async Task Init()
{
    await LoadInitialDataAsync();
}

protected async Task LoadInitialDataAsync()
{
    var loadResult = await LoadSomeStuffAsync();
    if (loadResult.IsBadNews)
    {
        ShowViewModel<ErrorViewModel>();
        return;
    }
}

MvxTrace日志告诉我在初始ViewModel上调用ShowViewModel后立即在ErrorViewModel上调用它,但是仅显示初始View,而不显示ErrorView.

为了“解决”这个问题,我可以做两件事之一.

我可以在Task.Run中包装对LoadInitialDataAsync的调用:

await Task.Run(async () =>
{
    await LoadInitialDataAsync();
});

或者,我可以在内部ShowViewModel调用之前添加一个小的延迟:

protected async Task LoadInitialDataAsync()
{
    var loadResult = await LoadSomeStuffAsync();
    if (loadResult.IsBadNews)
    {
        await Task.Delay(1);
        ShowViewModel<ErrorViewModel>();
        return;
    }
}

这些更改均会产生所需的结果-如果在加载过程中发生了不好的事情,ErrorViewModel将显示其视图.

问题是,我不信任此修复程序,因为我不了解众所周知的问题出在哪里,因此不知道此修复程序的强大程度.似乎是一个任意定时的事情,它将在将来最不方便的时间再次中断.

如果有人足够了解MvvmCross的内部结构可以对此提供帮助,我将不胜感激!

解决方法:

初始化方法应该做的很少. Init通常用于复制一些传递到ShowViewModel< TViewModel>()中的导航参数. Start方法用于执行ViewModel启动,例如调用LoadInitialDataAsync.请查看App Lifecycle documentation以获取更多信息.

上一篇:CS0117 C#“资源”不包含“可绘制”的定义


下一篇:C#-证明标签Xamarin形式的文本