在MVVMLight框架的ViewModel中实现NavigationService
2013-08-23 20:01
471 查看
网上已经有很多方法了,比如通过Messenger来实现等等。这里我只讲述一种我比较喜欢的方法,因为它很方便
首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类。在基类中定义
因为在MVVM中,我们将会在所有页面上都加上DataContext,只要拿到DataContext就能拿到ViewModel,所以我们就可以定义子类WPhoneApplicationPage来继承PhoneApplicationPage这个类。
这样在ViewModel中就可以调用NavigationService了。
此外,还需要修改View,让View继承WPhoneApplicationPage
xaml布局文件中
cs类文件中
这样你可以在你的ViewModel中使用NavigationService以及重载 ViewModel基类中提供的导航方法
首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类。在基类中定义
protected bool RemoveBackEntry { get; set; } public NavigationService NavigationService { get; set; } public NavigationContext NavigationContext { get; set; } public virtual void OnNavigatedTo(NavigationEventArgs e) { } public virtual void OnNavigatingFrom(NavigatingCancelEventArgs e) { } public virtual void OnNavigatedFrom(NavigationEventArgs e) { if (RemoveBackEntry) { RemoveBackEntry = false; NavigationService.RemoveBackEntry(); } }
因为在MVVM中,我们将会在所有页面上都加上DataContext,只要拿到DataContext就能拿到ViewModel,所以我们就可以定义子类WPhoneApplicationPage来继承PhoneApplicationPage这个类。
public class WPhoneApplicationPage : PhoneApplicationPage { protected WPhoneApplicationPage() { Loaded += PageBaseLoaded; } private void PageBaseLoaded(object sender, RoutedEventArgs e) { var viewModel = DataContext as ViewModel.ViewModel; if (viewModel != null) { viewModel.NavigationService = NavigationService; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); var viewModel = DataContext as ViewModel.ViewModel; if (viewModel != null) { viewModel.NavigationContext = NavigationContext; viewModel.OnNavigatedTo(e); } } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { base.OnNavigatingFrom(e); var viewModel = DataContext as ViewModel.ViewModel; if (viewModel != null) { viewModel.NavigationContext = NavigationContext; viewModel.OnNavigatingFrom(e); } } protected override void OnNavigatedFrom(NavigationEventArgs e) { base.OnNavigatedFrom(e); var viewModel = DataContext as ViewModel.ViewModel; if (viewModel != null) { viewModel.NavigationContext = NavigationContext; viewModel.OnNavigatedFrom(e); } } }
这样在ViewModel中就可以调用NavigationService了。
此外,还需要修改View,让View继承WPhoneApplicationPage
xaml布局文件中
<phone:WPhoneApplicationPage //修改PhoneApplicationPage 为 WPhoneApplicationPage xmlns:phone="clr-namespace:redrock.Core" //这里是你的WPhoneApplicationPage类所在的命名空间
cs类文件中
public partial class MainPage : WPhoneApplicationPage // 让MainPage继承WPhoneApplicationPage { public MainPage() { InitializeComponent(); } }
这样你可以在你的ViewModel中使用NavigationService以及重载 ViewModel基类中提供的导航方法
相关文章推荐
- MVVMLight Toolkit在Windows Phone中的使用扩展之一:在ViewModel中实现导航,并传递参数
- 迷你MVVM框架 avalonjs 学习教程2、模块化、ViewModel、作用域
- [Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现
- 实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架——RoboBinding
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
- WPF新手实践3:MVVM Light Toolkit(三、ViewModel和View)
- Prism 框架中使用IEventAggregator事件聚合器简单实现ViewModel之间的通讯
- MVVM模式的View与ViewModel的三大通讯方式:Binding Data(实现数据的传递)、Command(实现操作的调用)和Attached Behavior【转】
- mvvm框架下页面与ViewModel的各种参数传递方式
- Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现
- RoboBinding:一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架
- 一步一步重写 CodeIgniter 框架 (7) —— Controller执行时将 Model获得的数据传入View中,实现MVC
- 轻量级前端MVVM框架avalon - ViewModel
- WPF新手实践3:MVVM Light Toolkit(三、ViewModel和View)(转)
- MVVMLight源码分析之消息机制和ViewModelBase
- WPF新手实践4:MVVM Light Toolkit(四、Model、ViewModel和View)(转)
- 利刃 MVVMLight 2:Model、View、ViewModel结构以及全局视图模型注入器的说明
- MVVM模式通过ViewModel实现view和model的低耦合
- Mvvm Light ViewModelLocator (ViewModel加载器)
- MVVM模式通过ViewModel实现view和model的低耦合