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.通过 >> 可以向已有的文 ...
随机推荐
- Selenium2Library使用Remote功能(转载并更新)
在selenium2library库的open browser中,除了我们常用的url,browser外,还有几个不常用的参数.如:remote_url的用法 1.下载selenium-server- ...
- Linux系统重启network服务失败
问题描述 使用KVM通过修改配置文件配置好网卡IP,使用命令行service network restart 重启网络服务失败. 如图: 使用图形化管理工具配置IP,在系统界面右上角可以看到网卡状态为 ...
- POJ 3740 DLX
题意:给你一个01矩阵,然后求是否存在选择一些行,使得每一列的1的个数都为1. 思路:貌似朴素的DFS也可以,加点剪枝就可以过.这里贴个DLX的模版. 推荐博客:http://www.cppblog. ...
- aix Mysql-Rpm puppet puppetAgent
http://www.bullfreeware.com/toolbox.php (Large Open Source Software Archieve for AIX 提供MySQL5.1 fo ...
- aix 小机运维
zzbank 一个月折腾总结小总结:#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++#+ Ruiy-ge;#+#+ Te ...
- LOL是什么意思? - 已解决 - 搜狗问问
LOL是什么意思? - 已解决 - 搜狗问问 N A T S U . |分类:QQ工具栏 2009-05-04 LOL是什么意思? 满意答案 Shim Nyong 19级 2009-05-04 LOL ...
- android handler机制和Timer采用
Timer主要用于创建一个任务来定期运行. 创建继承Task该任务等级.即任务每次跑. private class MyTask extends TimerTask { @Override publi ...
- update慢怎样处理?
update慢: 1.表的pctfree參数设置? 2.运行计划用索引还是全表扫? 3.SQL语句写法问题? 4.update慢还是commit慢? 5.更新多少条数据? 6.表是否频繁update造 ...
- php,ajax登陆退出
利用ajax可以做到页面无刷新登陆. 运行效果 目录结构 site/ css/ images/ js/ site/css/bootstrap.css(bootstrap样式表) site/js/boo ...
- .net通用权限框架B/S(二) 数据库设计
1.组织机构---员工是1:n关系 2.角色---员工n:n 3.角色--导航菜单n:n 4.操作权限(id)---导航菜单(prms_id)n:n [此处是n:n关系正常是生成第三张表存放多对多 ...