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.通过 >> 可以向已有的文 ...
随机推荐
- 博士论文》》》 Journal,magazine,transaction,proceeding
Journal期刊:刊登关于某特殊主题的文章的期刊 magazine杂志:综合性内容的期刊 transactions(学会等的)议事录,会报,会刊 proceedings记录, 会议录; 年[学]报; ...
- C# 分析搜索引擎url 得到搜索关键字
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- java 多线程使用方法及Socket的使用
public class newThread implements Runnable{ public void run(){ dosome(); } public void dosome(){ Sys ...
- python cmd 模块
command模块用于执行以字符串形式指定的简单系统命令,并将其输出以字符串形式返回.此模块尽在unix系统上有效.这个模型提供的功能与在unix shell脚本使用的反引号(就是~这个键下的那个反引 ...
- 获取枚举Name,Value,Description两种方法
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- mac itunes ios 7 升级 出现 this device isn't eligible for the requested build
今天在对我的iPod 进行iOS7 升级的时候(在mac iTunes 上进行的),一直弹出框提示 解决办法就是 1. 打开HOSTS (Mac 下路径为:/etc/hosts, 至于怎么打开host ...
- [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found
google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...
- Adroid: getExternalStorageDirectory 不一定是你想要的外部存储SdCard
前情提要:我的测试机是华为荣耀6,我装过一个16G的内存卡 因为要面试的需要,我的一个演示项目用的是android本地的WebService.然而写好的webService部署到本地上,应用怎么获取数 ...
- Javascript 常用
第一步,实现百度输入法的页面布局 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- Asp.Net MVC 常用开发方式之EF Code First
在我们的工作和学习当中,经常会遇到中小型项目,这些项目除了业务上的区别较大外,对于底层和数据访问,其实都差不多.记得以前做项目时,每次都要重复的写底层操作数据库的代码,不仅浪费时间,也无太大意思,后来 ...