在mvvmcross中展示非视图/视图模型的视图

14

如何在mvvmcross中从非视图文件中打开视图?在视图模型内部,我们会使用ShowViewModel<>(..)。

具体来说,我们正在响应推送通知来启动应用程序(带有自定义有效载荷),该有效载荷指定了应加载的视图。

我们有一个hackety解决方案,只是为了概念证明,想弄清楚正确的MVX方法。

2个回答

17

我认为没有一种“正确的方法”-我认为这取决于您的应用程序以及您需要它执行的任务。

对于某些特定情况-例如ViewModel->ViewModel和AppStart-MvvmCross提供了一些方便的方法:

但总体而言,任何类都可以通过调用以下方式请求ShowViewModel

         var viewDispatcher = Mvx.Resolve<IMvxViewDispatcher>();
         viewDispatcher.ShowViewModel(new MvxViewModelRequest(
                                                    viewModelType,
                                                    parameterBundle,
                                                    presentationBundle,
                                                    requestedBy));

此外,有一个基类 - MvxNavigatingObject.cs - 可以帮助解决这个问题(它是MvxViewModel和MvxAppStart的基类),所以您可以轻松地提供一个或多个服务,如INavigateMyselfService,其实现继承自MvxNavigatingObject

  public interface INavigateMyselfService
  {
      void GoWild(string side);
  }

  public class NavigateMyselfService
     : MvxNavigatingObject
     , INavigateMyselfService
  {
      public void GoWild(string side)
      {
          ShowViewModel<WildViewModel>(new { side = side });
      }
  }

1
Ah,IMvxViewDispatcher正是我在寻找的!INavigateMyselfService与我所做的类似,只不过我的实现方式不太好看。 - geoffreys
@Stuart,感谢您在Xamarin社区中所做的所有工作!这真是太完美了。我正在使用它来处理我的应用程序中的未经授权的异常。如果我捕获到这样的异常,现在我可以使用它轻松地导航到登录屏幕。 - dynamokaj
@Stuart 我们在导航到 SplashScreenViewModel 并在一段时间后导航到 MainViewModel 的情况下,看到了随机的视图模型导航失败。两者都使用 ShowViewModel<XYZ>(); API。 我们最终得到了“mvx:Diagnostic: 70.22 Showing ViewModel MainViewModel”的日志,但应用程序仍停留在 SplashScreenViewModel 上。 有什么提示可以帮助我们调试吗? 谢谢! - baraka

0

http://forums.xamarin.com/discussion/4694/conditionally-call-registerappstart-with-mvvmcross

请查看上面的链接,你会了解到一些想法。

在我的情况下,我想从辅助磁贴启动应用程序。为此,我必须启动特定的辅助磁贴页面。

我的初始应用程序启动视图模型是LoginViewModel,而我的自定义应用程序启动视图模型是HomeViewModel。

我从App.cs(核心)控制这一点,到MyCustomAppStart类。

请参考上述链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接