CoreDispatcher.HasThreadAccess“破坏变化”

时间:2013-04-19 08:08:26

标签: c# windows-runtime mvvmcross

我正在接管使用MvvmCross.vNext开发的应用程序 在尝试使用MvvmCross.V3更新它时,我发现了以下重大变化:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。 它在vNext中运行良好 但是使用V3时,LoginView不会显示 经过搜索后,我发现以下代码添加在 MvxStoreMainThreadDispatcher.RequestMainThreadAction 中:

        if (_uiDispatcher.HasThreadAccess)
        {
            action();
            return true;
        }

对我的麻烦负责 如果我评论它,我的应用程序像以前一样工作,但我想这个代码是出于某些原因... ... 你有什么建议吗? 我可以在不更改MvvmCross源代码的情况下强制执行上一行为吗? 我应该重构代码以不同的方式处理LoginView吗? 提前感谢您的意见。
菲利普

1 个答案:

答案 0 :(得分:1)

  

在尝试使用MvvmCross.V3更新它时,我发现了以下重大变化:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。它在vNext中运行良好。

我认为你的构造函数导航在任何MvvmCross版本的几个平台上都会破坏。说实话,我觉得你以前很幸运。

问题是ViewModel是在ViewDidLoadOnNavigatedToOnCreate等View事件中构建(或定位)的 - 这些事件通常都是 在“页面转换”期间调用

要解决此问题,您将需要将登录导航移出构造函数。

如何执行此操作取决于您的应用

  • 如果您确实需要Home-> Login backstack,那么您可以触发一些异步或时间延迟,或者您可以触发其他一些View事件,例如ViewDidAppear

  • 如果您不需要该Backstack,那么我通常实现这种方式的方法是使用自定义IMvxAppStart - 类似于:

    public class AppStart
        : MvxNavigatingObject
        , IMvxAppStart      
    {
        public void Start(object hint = null)
        {
            var authService = Mvx.Resolve<IMySerice>();
            if (authService.IsLoggedIn)
            {
                ShowViewModel<HomeViewModel>();
            }
            else
            {
                ShowViewModel<LoginViewModel>();
            }
        }
    }
    

    (你可以在https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CirriousConference/Cirrious.Conference.Core/ApplicationObjects/AppStart.cs中看到另一个例子)

    这可以使用以下命令在App.cs启动中注册:

    RegisterAppStart(new AppStart());