在MVVMLight框架的ViewModel中实现NavigationService
网上已经有很多方法了,比如通过Messenger来实现等等。这里我只讲述一种我比较喜欢的方法,因为它很方便
首先定义一个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框架的ViewModel中实现NavigationService的更多相关文章
- MVVM模式应用 之在ViewModel中使用NavigationService
在ViewModel.cs页面中是不能使用NavigationService,那该怎么实现跳转呢? 其实在ViewModel中实现页面的跳转也很简单,下面的代码: using Microsoft.Ph ...
- MVVMLight Toolkit在Windows Phone中的使用扩展之一:在ViewModel中实现导航,并传递参数
MVVMLight是MVVM开发模式在Windows Phone平台下的一个开发框架,关于MVVMLight的基础使用,已经有人写的很好了,可以参照:MVVM.MVVMLight.MVVMLight ...
- 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令
应用场景 我现在做一个系统登录功能,要求在PasswordBox上输完密码后回车,能够响应Enter事件,并执行ViewModel中对应的方法.如果登录成功则隐藏当前窗口显示主窗体,登录失败则焦点返回 ...
- MvvmLight框架使用入门(一)
MvvmLight是比较流行的MVVM框架,相对较为简单易用.可能正因为简单,对应的帮助文档不多,对初学者就不够友好了.这里会用几篇随笔,就个人对MvvmLight的使用经验,来做一个入门的介绍. 第 ...
- MvvmLight框架使用入门(三)
本篇是MvvmLight框架使用入门的第三篇.从本篇开始,所有代码将通过Windows 10的Universal App来演示.我们将创建一个Universal App并应用MvvmLight框架. ...
- MVVMlight框架应用:Data Binding、Command
常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的:在MVVMLight框架里,这里我们定 ...
- MvvmLight框架使用入门(四)
本篇我们着重介绍ViewModelBase,演示Set和RaisePropertyChanged方法的使用,以及就Cleanup方法释放资源展开讨论. ICleanup 接口.实现该接口的ViewMo ...
- MvvmLight框架使用入门(二)
上一篇我们简单对MvvmLight做了介绍.罗列了三个DLL中,各个命名空间下主要类的定义及大致作用.因为只是范范的概论,对于从未接触过MvvmLight的萌新来说,根本就是在晃点他们.不过万事开头难 ...
- MVVMLight学习笔记(二)---MVVMLight框架初探
一.MVVM分层概述 MVVM中,各个部分的职责如下: Model:负责数据实体的结构处理,与ViewModel进行交互: View:负责界面显示,与ViewModel进行数据和命令的交互: View ...
随机推荐
- BeanDefinitionRegistry extends AliasRegistry
// 用该Registry注册一个新定义的bean,但是新的bean必须支持父的定义和子的定义void registerBeanDefinition(String beanName, BeanDefi ...
- css笔记19:浮动的案例
案例一: 1. 首先是01.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- oracle11g asm standalone 单实例重建
原文地址:oracle11g asm单实例重建has 作者:datapeng 最近到客户那里处理故障,客户说,他们修改了一下hostname,导到has出现了问题,当然,他们的数据库也就无法再启动,把 ...
- Java动态加载jar及class文件
经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...
- 一些xcode5.1创建的工程在xcode6.0下不能编译的问题
这是因为Xcode5.1.1自动选上了arm64架构, 建议解决办法是: Build Settings-ValidArchitectures中却掉arm64
- Bootstrap ACE后台管理界面模板-jquery已整理
做后台通用模板,基于bootstrap,jquery写成的模板,非常齐全.国内不能正常访问google我将不能访问的jquery替换成cdn.bootcss.com网站下的jquery 链接: htt ...
- Ehcache(2.9.x) - API Developer Guide, Basic Caching
Creating a CacheManager All usages of the Ehcache API start with the creation of a CacheManager. The ...
- [转]C#如何在ListView失去焦点的情况下仍然保持Item高亮
private void listView1_SelectedIndexChanged(object sender, EventArgs e) { foreach(ListViewItem itm i ...
- 我眼中的go的语法特点
因为基本从c#/javascript/c/c++/python/lua/action script,一路走来,对所有的C系列的语法既熟悉又有好感: 那在看语言的时候肯定会与C系列的东西进行类比,那就总 ...
- Cocos2d-x优化中图片优化
在2D游戏中图片无疑是最为重要的资源文件,它会被加载到内存中转换为纹理,由GPU贴在精灵之上渲染出来.它能够优化的方面很多,包括:图片格式.拼图和纹理格式等,下面我们从这几个方面介绍一下图片和纹理的优 ...