,并希望找到处理页面导航的最佳方式,而无需在代码背后使用大量逻辑。我想将代码尽可能整齐地放在我的视图中。响应按钮单击导航到新页面的MVVM方式是什么?我目前必须从ViewModel向View发送RelayCommand消息,其中包含要导航到的页面的详细信息。这意味着后面的代码必须连接如下:publicMainPage(){InitializeComponent();Messenger.Default.Register(this,(article)=>ReceiveOpenArticleMessage(article));...}privateobjectReceiveOpenArticleMessage(OpenArticleMessage文章){Frame.Navigate(typeof(ArticleView));虽然这确实有效,但它似乎不是最好的方法。如何直接从ViewModel进行页面导航?我在我的项目中使用MVVM-Light。好的,我找到了这个问题的答案。做了一些研究,但我最终找到了首选的MVVM-Light方式。无论如何我都不会赞成这个答案,只是将它张贴在这里以防人们正在寻找这个问题的答案。创建一个INavigationService接口,如下所示:publicinterfaceINavigationService{voidNavigate(TypesourcePageType);voidNavigate(类型sourcePageType,对象参数);无效返回();}创建一个NavigationService类,如下所示:publicclassNavigationService:INavigationService{publicvoidNavigate(TypesourcePageType){((Frame)Window.Current.Content).Navigate(sourcePageType);}publicvoidNavigate(TypesourcePageType,objectparameter){((Frame)Window.Current.Content).Navigate(sourcePageType,parameter);}publicvoidGoBack(){((Frame)Window.Current.Content).GoBack();}}现在在ViewModelLocator中,将其设置如下:]publicMainViewModelMain{get{返回ServiceLocator.Current.GetInstance();}}staticViewModelLocator(){ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);如果(ViewModelBase.IsInDesignModeStatic){SimpleIoc.Default.Register();}else{SimpleIoc.Default.Register(()=>newNavigationService());}SimpleIoc.Default.Register();}接下来设置导航服务的设计时序如下:publicclassDesignNavigationService:INavigationService{//这个类不执行导航,以避免设计者在设计时出现问题。publicvoidNavigate(TypesourcePageType){}publicvoidNavigate(TypesourcePageType,objectparameter){}publicvoidGoBack(){}}我的MainViewModel构造函数如下:publicMainViewModel(INavigationServicenavigationService){_navigationService=navigationService;...现在您可以使用它在视图模型中导航:_navigationService.Navigate(typeof(WelcomeView));有关原作者LaurentBugnion的更多详细信息,请参阅本文和相关代码http://msdn.microsoft.com/en-us/magazine/jj651572.aspx这里有一个新的更简单的实现:https://marcominerva.wordpress.com/2014/10/10/navigationservice-in-mvvm-light-v5/首先我们创建NavigationService和DialogService(用于页面导航参数):publicViewModelLocator(){ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);varnavigationService=this.CreateNavigationService();SimpleIoc.默认值。注册(()=>导航服务);SimpleIoc.Default.Register();SimpleIoc.Default.Register();SimpleIoc.Default.Register();}privateINavigationServiceCreateNavigationService(){varnavigationService=newNavigationService();配置(“详细信息”,typeof(DetailsPage));//navigationService.Configure("key1",typeof(OtherPage1));//navigationService.Configure("key2",typeof(OtherPage2));返回导航服务;然后我们在ViewModel中创建一个RelayCommand和NavigationService,如下所示:publicclassMainViewModel:ViewModelBase{privateINavigationService_navigationService;公共RelayCommand>DetailsCommand{get;放;}publicMainViewModel(INavigationServicenavigationService){this._navigationService=navigationService;DetailsCommand=newRelayCommand>((args)=>NavigateTo(args));}publicvoidNavigateTo(Tupleargs){this._navigationService.NavigateTo(args.Item1,args.Item1);}publicvoidClickAndNavigate(){NavigateTo(newTuple("AdminPivotPage","TestParams"));}}最后,我们可以像这样获取页面导航参数://"我的数据"base.OnNavigatedTo(e);但是请阅读模态页面导航中传递的MVVM参数,您可以在这里看到我同意上面的ricochete,它更简单,尽管我的直接暗示搞砸了我在Blend中的设计数据绑定。我决定创建一个继承自NavigationServicepublicclassNavigationServiceHelper的类:NavigationService{publicNavigationServiceHelper(){this.Configure("Page1",typeof(View.Page1));this.Configure("Page2",typeof(View.Page2));然后在ViewModelLocator中我以这种方式注册了它SimpleIoc.Default.Register();我的设计视图数据绑定再次工作。如果有人能解释为什么设计数据不适用于上面的flex模板,请解释。谢谢!以上就是C#学习教程:从WindowsPhone8.1通用应用中的ViewModel导航到新页面分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
