ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

wpf prism 《2》 mvvm 命令 复合命令、导航 区域导航

wpf prism 《2》 mvvm 命令 复合命令、导航 区域导航 命令 跟 toolkitmvvm中的 RelayCommand 一样 只是写法不一样复合命令 CompositeCommandCompositeCommand VS DelegateCommand》》》主程序usingPrism.Commands;usingPrism.Mvvm;usingPrism.Navigation;usingPrism.Navigation.Regions;usingSystem;namespaceBlankApp2.ViewModels{publicclassMainViewModel:BindableBase{privatestring_titlePrism Application;publicstringTitle{get{return_title;}set{SetProperty(ref_title,value);}}privatereadonlyIRegionManager_regionManager;//区域导航日志privateIRegionNavigationJournal_journal;publicDelegateCommandstringOpenCommand{get;privateset;}publicDelegateCommandBackCommand{get;privateset;}publicMainViewModel(IRegionManagerregionManager){this._regionManagerregionManager;this.OpenCommandnewDelegateCommandstring(Open);this.BackCommandnewDelegateCommand(Back);}privatevoidBack(){if(_journal.CanGoBack){_journal.GoBack();//_journal.GoForward();}}privatevoidOpen(stringobj){INavigationParameterskeyValuePairsnewNavigationParameters();keyValuePairs.Add(zen,zen);_regionManager.Regions[ContentRegion].RequestNavigate(obj,callback,keyValuePairs);}privatevoidcallback(NavigationResultresult){if(result.Success){this._journalresult.Context.NavigationService.Journal;}}}}usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;namespaceModuleA.ViewModels{//IConfirmNavigationRequest 继承 INavigationAwarepublicclassViewAViewModel:BindableBase,IConfirmNavigationRequest{privatestringnavValue;publicstringNavValue{get{returnnavValue;}set{navValuevalue;RaisePropertyChanged();}}publicViewAViewModel(){}publicvoidConfirmNavigationRequest(NavigationContextnavigationContext,ActionboolcontinuationCallback){//throw new NotImplementedException();//拦截切换导航boolresultfalse;if(MessageBox.Show(确认导航,Tip,MessageBoxButton.YesNo)MessageBoxResult.Yes){resulttrue;}continuationCallback(result);}/// summary/// 首次不触发再次导航时是否重用原来的实例/// 调用时机: 在导航发生时,Prism会询问当前实例是否应该被重用作为导航目标./// IsNavigationTarget()方法用来空时视图或者视图模型实例在导航时是否被重用./// 当你尝试导航到一个新的视图的时候,Prism会检查当前活动的视图或者视图模型的实例/// ,并调用他们的IsNavigationTarget方法,以决定是否可以重用这个实例.如果返回true,/// prism框架将不会创建新的视图或者视图模型实例,而是重用当前的实例./// 这种方式非常适用于那些数据和状态不需要每次都重新加载的视图,可以提高应用程序的响应速度和资源利用率./// /summary/// param namenavigationContext/param/// returns/returnspublicboolIsNavigationTarget(NavigationContextnavigationContext){returntrue;}/// summary/// 当从当前视图或者视图模型导航离开时,该方法被调用. 就是比如你从ViewC导航到ViewB的时候,/// 如果导航成功[ConfirmNavigationRequest],就是要打开ViewB以及离开ViewC的时候,/// ViewC对应的ViewCModel中的OnNavigationFrom()会被调用.///作用就是允许你在视图或者视图模型不再是导航目标后执行清理或者保存状态的代码.///这是保存当前视图状态或者是取消订阅事件的好地方/// /summary/// param namenavigationContext/parampublicvoidOnNavigatedFrom(NavigationContextnavigationContext){//throw new NotImplementedException();}/// summary/// 导航到某个视图//调用时机: 当导航到某个试图或者视图模型时,该方法被调用,比如导航到ViewA的时候ViewAModel中的这个方法就会被调用.//作用就是允许你在视图或者是视图模型成为导航目标后执行代码.比如处理参数以及做一些初始化的工作./// /summary/// param namenavigationContext/parampublicvoidOnNavigatedTo(NavigationContextnavigationContext){if(navigationContext.Parameters.ContainsKey(zen)){this.NavValuenavigationContext.Parameters.GetValuestring(zen);}//throw new NotImplementedException();}}}源码项目代码》》》MainWindowViewModelusingPrism.Commands;usingPrism.Events;usingPrism.Mvvm;usingPrism.Regions;namespaceBlankApp1.ViewModels{publicclassMainWindowViewModel:BindableBase{privatestring_titlePrism Application;publicstringTitle{get{return_title;}set{SetProperty(ref_title,value);}}publicDelegateCommandstringBtnCommand{get;privateset;}publicDelegateCommandPreCommand{get;privateset;}publicDelegateCommandAfterCommand{get;privateset;}privateIRegionManager_regionManager;privateIRegionNavigationJournaljournal;publicMainWindowViewModel(IRegionManagerregionManager){NavigationParametersnpsnewNavigationParameters();nps.Add(UserName,Kaizen);_regionManagerregionManager;BtnCommandnewDelegateCommandstring((agrs){//下面三种方法都行//_regionManager.Regions[ContentRegion].RequestNavigate(agrs,nps);//_regionManager.RequestNavigate(ContentRegion, agrs?UserName123);//_regionManager.RequestNavigate(ContentRegion, agrs, nps);//含导航日志的//void RequestNavigate(string regionName, string target, ActionNavigationResult navigationCallback, NavigationParameters navigationParameters)_regionManager.RequestNavigate(ContentRegion,agrs,naback{journalnaback.Context.NavigationService.Journal;},nps);});PreCommandnewDelegateCommand((){journal.GoForward();});AfterCommandnewDelegateCommand((){journal.GoBack();});}}}》》》 ContactViewModelusingPrism.Commands;usingPrism.Mvvm;usingPrism.Regions;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Windows;usingSystem.Windows.Documents;namespaceBlankApp1.ViewModels{//IConfirmNavigationRequest 继承了 INavigationAwarepublicclassContactViewModel:BindableBase,IConfirmNavigationRequest{privatestringtitle;publicstringTitle{get{returntitle;}set{SetProperty(reftitle,value);}}publicContactViewModel(){}publicboolIsNavigationTarget(NavigationContextnavigationContext){//throw new NotImplementedException();//true复用当前实例不创建新实例。false创建新的视图实例。returntrue;}publicvoidOnNavigatedFrom(NavigationContextnavigationContext){//throw new NotImplementedException();}publicvoidOnNavigatedTo(NavigationContextnavigationContext){//throw new NotImplementedException();//// 直接索引//this.Title navigationContext.Parameters[UserName].ToString();//// 泛型安全获取this.TitlenavigationContext.Parameters.GetValuestring(UserName)DateTime.Now.ToString();}publicvoidConfirmNavigationRequest(NavigationContextnavigationContext,ActionboolcontinuationCallback){//throw new NotImplementedException();boolresultfalse;if(MessageBox.Show(您确定离开该页面吗,友情提示,MessageBoxButton.YesNo)MessageBoxResult.Yes)resulttrue;continuationCallback(result);}}}
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进