Windows phone 8 mvvmcross:NavigationService.Navigate抛出一个MvxException;找不到传入的mvxviewmodelrequest“;

Windows phone 8 mvvmcross:NavigationService.Navigate抛出一个MvxException;找不到传入的mvxviewmodelrequest“;,windows-phone-8,windows-phone,mvvmcross,Windows Phone 8,Windows Phone,Mvvmcross,在我的WP8应用程序中,我有MainView引用MainViewModel。MainView是一个菜单,用户可以在其中导航到其他视图以执行某些任务。使用ShowViewModel时,从MainView导航效果非常好。但是,当用户完成任务时,使用NavigationService.Navigate(URI)从其他视图导航回MainView会引发异常“找不到传入的mvxviewmodelrequest” 为了避免这个异常,我构建了如下URI var req = "{\"ViewModelType\"

在我的WP8应用程序中,我有MainView引用MainViewModel。MainView是一个菜单,用户可以在其中导航到其他视图以执行某些任务。使用ShowViewModel时,从MainView导航效果非常好。但是,当用户完成任务时,使用NavigationService.Navigate(URI)从其他视图导航回MainView会引发异常“找不到传入的mvxviewmodelrequest”

为了避免这个异常,我构建了如下URI

var req = "{\"ViewModelType\":\"MyApp.Core.ViewModels.MainViewModel, MyApp.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\",\"ClearTop\":\"true\",\"ParameterValues\":null,\"RequestedBy\":null}";
NavigationService.Navigate(new Uri("/MainView.xaml?ApplicationUrl=" + Uri.EscapeDataString(req), UriKind.Relative));

是否有人有更好的方法使用NavigationService.Navigate?

MvvmCross示例中的大多数导航都是由
MvxAppStart
对象或
MvxViewModel
启动的。这两个类都继承自
MvxNavigatingObject
,并使用此处公开的
ShowViewModel
方法-请参阅

MvxNavigatingObject
,您可以看到MvvmCross将导航调用路由到
IMvxViewDispatcher
,它在WindowsPhone中是一个非常薄的对象-它所做的只是将所有调用整理到UI线程,并将它们传递到
IMvxViewPresenter
-请参阅

演示者是在
设置中创建的对象,默认实现使用
IMvxPhoneViewModelRequestTranslator
将导航调用转换为基于uri的导航-请参阅

Silverlight/WindowsPhone然后使用此uri进行导航,创建必要的Xaml页面,然后在此页面上调用
OnNavigatedTo
。作为
base.OnNavigatedTo()的一部分提交
MvxPhonePage
,然后MvvmCross调用
OnViewCreated
扩展方法。此方法检查是否已经存在ViewModel—如果没有,则尝试使用uri中的信息查找ViewModel—请参阅


考虑到这一解释,如果任何应用程序想要从尚未继承自
MvxNavigatingObject
的类启动MvvmCross navigation,例如从某些
服务
或其他类,那么有几个选项:

  • 您可以提供一个垫片对象来进行导航-例如:

     public class MyNavigator : MvxNavigatingObject {
          public void DoIt() {
              ShowViewModel<MyViewModel>();
          }
     }
    
     // used as:
     var m = new MyNavigator();
     m.DoIt();
    
  • 您可以编写模拟
    IMvxViewPresenter
    功能的手动代码-与您的代码完全相同-尽管使用
    IMvxPhoneViewModelRequestTranslator.cs
    来帮助生成url可能“更安全”-请参阅


    或者,在WindowsPhone中,您甚至可以使用不同的基类替换MvxPhonePage,该基类使用自己的viewmodel位置逻辑。这在WindowsPhone中很容易做到,因为所有Xaml页面都有内置的数据绑定支持。

    MvvmCross示例中的大多数导航都是由
    MvxAppStart
    对象或
    MvxViewModel
    启动的。这两个类都继承自
    MvxNavigatingObject
    ,并使用此处公开的
    ShowViewModel
    方法-请参阅

    MvxNavigatingObject
    ,您可以看到MvvmCross将导航调用路由到
    IMvxViewDispatcher
    ,它在WindowsPhone中是一个非常薄的对象-它所做的只是将所有调用整理到UI线程,并将它们传递到
    IMvxViewPresenter
    -请参阅

    演示者是在
    设置中创建的对象,默认实现使用
    IMvxPhoneViewModelRequestTranslator
    将导航调用转换为基于uri的导航-请参阅

    Silverlight/WindowsPhone然后使用此uri进行导航,创建必要的Xaml页面,然后在此页面上调用
    OnNavigatedTo
    。作为
    base.OnNavigatedTo()的一部分提交
    MvxPhonePage
    ,然后MvvmCross调用
    OnViewCreated
    扩展方法。此方法检查是否已经存在ViewModel—如果没有,则尝试使用uri中的信息查找ViewModel—请参阅


    考虑到这一解释,如果任何应用程序想要从尚未继承自
    MvxNavigatingObject
    的类启动MvvmCross navigation,例如从某些
    服务
    或其他类,那么有几个选项:

  • 您可以提供一个垫片对象来进行导航-例如:

     public class MyNavigator : MvxNavigatingObject {
          public void DoIt() {
              ShowViewModel<MyViewModel>();
          }
     }
    
     // used as:
     var m = new MyNavigator();
     m.DoIt();
    
  • 您可以编写模拟
    IMvxViewPresenter
    功能的手动代码-与您的代码完全相同-尽管使用
    IMvxPhoneViewModelRequestTranslator.cs
    来帮助生成url可能“更安全”-请参阅

    或者,在WindowsPhone中,您甚至可以使用不同的基类替换MvxPhonePage,该基类使用自己的viewmodel位置逻辑。这在WindowsPhone中很容易做到,因为所有Xaml页面都具有内置的数据绑定支持

     var request = MvxViewModelRequest<MyViewModel>.GetDefaultRequest();
     var translator = Mvx.Resolve<IMvxPhoneViewModelRequestTranslator>();
     var uri = translator.GetXamlUriFor(request);
    
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (ViewModel == null) {
               ViewModel = // something I locate
            }
    
            // if you are doing your own logic then `base.OnNavigatedTo` isn't really needed in winphone
            // but I always call it anyway
            base.OnNavigatedTo(e);
        }