MVVMLight Toolkit在Windows Phone中的使用扩展之一:在ViewModel中实现导航,并传递参数
MVVMLight是MVVM开发模式在Windows Phone平台下的一个开发框架,关于MVVMLight的基础使用,已经有人写的很好了,可以参照:MVVM、MVVMLight、MVVMLight Toolkit之我见 - 陈希章 - 博客园
但是有些业务逻辑写在Code-Behind里面是不合适的,而通过在ViewModel中实现导航,实现OnNavigated、OnBackPress事件则是一个比较好的方法,参照Prism框架的实现方式,我做了一个MvvmLight的一个Extension。
该DLL可在http://download.csdn.net/detail/coaxhappy/5800445下载,并可任意反编译。
简要介绍如下:
1、先看类库的结构图
INavigateService.cs 是一个导航的接口类,定义了一系列导航的接口。
NavigateService是对INavigateService的实现。
NavigationParamsEventArgs继承了EventArgs,来实现导航时的参数传递
NavigationUri封装了一个导航时的Uri对象,来实现在导航时可以传递对象,而非仅仅是字符串
ViewModelBaseExtra是对MvvmLight框架的ViewModelBase的一个扩展,以实现在ViewModel中可以实现OnNaivgated事件、OnBackPress事件等。
RelayCommandExtra本意是对RelayCommand的一个扩展,来保证在连续触发Command时,Command内的代码会顺序执行,在上一次触发未完成之前,不会进行下一次触发,但是由于异步的原因,这个效果不佳,有什么好的建议请联系我。
2、如何实现在ViewModel中实现导航
MvvmLight框架是通过SimpleIoc来注册服务来管理服务的,依据这个原理将导航的Service也注册到SimpleIoc中,并传递RootFrame到INavigateService中,在NavigateService中对导航事件进行封装来实现导航。
第一:在ViewModelLocator中注册INavigateService
SimpleIoc.Default.Register<INavigateService>(() => new NavigateService(App.RootFrame));
第二:将所有的ViewModel继承自ViewModelBaseExtra ,并实现构造函数
public SearchOrdersViewModel(INavigateService navigateService)
: base(navigateService)
{
this.navigationService = navigateService;
}
第三:在App.xaml.cs中注册View和ViewModel的对应关系
private void InitializePhoneApplication()
{
if (phoneApplicationInitialized)
return; // Create the frame but don't set it as RootVisual yet; this allows the splash
// screen to remain active until the application is ready to render.
RootFrame = new PhoneApplicationFrame(); //RootFrame.Background = new SolidColorBrush(Colors.White); RootFrame.Navigated += CompleteInitializePhoneApplication; DispatcherHelper.Initialize(); // Handle navigation failures
RootFrame.NavigationFailed += RootFrame_NavigationFailed; // Handle reset requests for clearing the backstack
RootFrame.Navigated += CheckForResetNavigation; // Ensure we don't initialize again
phoneApplicationInitialized = true; //注册View和ViewModel的对应关系
RegisterViewViewModel();
}
private void RegisterViewViewModel()
{
INavigateService navigateService = ServiceLocator.Current.GetInstance<INavigateService>(); navigateService.Register<MainView, MainViewModel>();
navigateService.Register<LoginView, LoginViewModel>();
navigateService.Register<UserCenterView, UserCenterViewModel>();
navigateService.Register<UpdatePasswordView, UpdatePasswordViewModel>();
navigateService.Register<OrderCenterView, OrderCenterViewModel>();
navigateService.Register<OrderDetailView, OrderDetailViewModel>();
navigateService.Register<MessageSettingView, MessageSettingViewModel>();
}
第四、在ViewModel中重写OnNavigated函数、或者OnBackPress函数
protected override void OnNavigated(object sender, NavigationParamsEventArgs e)
{
base.OnNavigated(sender, e);
}
protected override void OnBackPress(object sender, System.ComponentModel.CancelEventArgs e)
{
base.OnBackPress(sender, e);
}
第五、通过navigationService的依赖注入实现导航
private INavigateService navigationService;
public MyNotesViewModel(INavigateService navigationService)
: base(navigationService)
{
this.navigationService = navigationService;
}
NavigationUri uri = new NavigationUri(ConstValues.NAVIGATION_PAGE_URI_ORDERDETAILVIEW);
uri.AddParameter<string, string>(ConstValues.NAVIGATION_KEY_ORDER_ID, orderId);
navigationService.Navigate(uri);
第六、在OnNavigated事件中接收参数
protected override void OnNavigated(object sender, NavigationParamsEventArgs e)
{
if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)
{
string orderId = e.GetParamater<string, string>(ConstValues.NAVIGATION_KEY_ORDER_ID);
}
}
有任何好的建议或意见请联系我
邮箱:leftxden@hotmail.com
MVVMLight Toolkit在Windows Phone中的使用扩展之一:在ViewModel中实现导航,并传递参数的更多相关文章
- MVVM、MVVMLight、MVVMLight Toolkit之我见
原文:MVVM.MVVMLight.MVVMLight Toolkit之我见 我想,现在已经有不少朋友在项目中使用了MVVMLight了吧,如果你正在做WPF,Silverlight,Windows ...
- 在 Windows Azure 网站中进行纵向扩展和横向扩展
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...
- 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作
原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存
第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...
- Windows平台下Oracle监听服务启动过程中日志输出
Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...
- 如何把Windows主机中的文件拉到centOS虚拟机中
如何把Windows主机中的文件拉到centOS虚拟机中 2017年02月19日 22:19:12 Ariel_lin2017 阅读数:6023 标签: vmware tools共享文件 之前写了 ...
- 【Linux】windows下编写的脚本文件,放到Linux中无法识别格式
注意:我启动的时候遇到脚本错误 » sh startup.sh -m standalone tanghuang@bogon : command not found : command not foun ...
- 在MVVMLight框架的ViewModel中实现NavigationService
网上已经有很多方法了,比如通过Messenger来实现等等.这里我只讲述一种我比较喜欢的方法,因为它很方便 首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类.在基类中定义 ...
- Windows 在命令行中将输出内容放到文件中
1.将命令行中输出的内容存储到文件中. 使用重定向符号 “>” 就可以了. 通过 > 可以创建新文件并将内容放到文件中,如果文件存在,则会覆盖. 2.通过 >> 可以向已有的文 ...
随机推荐
- Oracle EBS-SQL (BOM-10):检查有BOM无计划员的数据.sql
select DISTINCT msi.segment1 编码 ,msi.description 描述 ,msi.item_type 物料类型 ,msi.inventory_ ...
- 论山寨手机与Android 【11】移动网络规范的合纵连横
上一章我们讨论了SmartPhone BP部分的硬件系统,接下去我们将讨论SmartPhone BP部分的软件系统.所谓BP,指的是基带处理器(Baseband Processor),又称为通讯处理器 ...
- schema://host[:port#]/path/.../[?query-string][#anchor]
1:http协议状态200 OK最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端 302 Found重定向,新的URL会在response 中的Location ...
- C语言的本质(1)——计算机与二进制
人类的计数方式通常是"逢十进一",称为十进制(Decimal),大概因为人有十个手指,所以十进制是最自然的计数方式,各民族的文字中都有十个数字,而阿拉伯数字0-9是目前最广泛采用的 ...
- poj1484---判断保险丝是否烧断
题目输入要求: 2 2 10 //设备数n 接下来的操作数m 保险丝能承受最大电流c5 //电器1的电流7 //2的电流1 //反转开关12 //反转开关2 思路:设置一个flag数组,记得每次 ...
- c++犯过的严重错误
1.if(num == 0)写成了if(num = 0)导致软件运行一直崩溃且找不到原因,浪费了很大的代价,以后我写这种语法的时候一直写if(0 == num) 2.if (sting.find(&q ...
- 系统学习Linux的11点建议
一.从基础开始 常常有些朋友在 Linux 论坛问一些问题,不过,其中大多数的问题都是很基础的.例如为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不 ...
- UCML快速开发平台学习1-UCML环境安装
最近公司项目时间紧张,经过各位大神的PK,决定用多年前话10W采购过来,一直被雪藏的UCML来开发.为啥花了钱买回来不用我就不吐槽了. UCML安装 翻看安装手册,貌似不 ...
- 经典:十步完全理解 SQL
经典:十步完全理解 SQL 来源:伯乐在线 链接:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完 ...
- java 线程之间通信以及notify与notifyAll区别。
jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...