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中实现导航,并传递参数的更多相关文章

  1. MVVM、MVVMLight、MVVMLight Toolkit之我见

    原文:MVVM.MVVMLight.MVVMLight Toolkit之我见 我想,现在已经有不少朋友在项目中使用了MVVMLight了吧,如果你正在做WPF,Silverlight,Windows ...

  2. 在 Windows Azure 网站中进行纵向扩展和横向扩展

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...

  3. 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作

    原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...

  4. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  5. Windows平台下Oracle监听服务启动过程中日志输出

    Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...

  6. 如何把Windows主机中的文件拉到centOS虚拟机中

    如何把Windows主机中的文件拉到centOS虚拟机中 2017年02月19日 22:19:12 Ariel_lin2017 阅读数:6023 标签: vmware tools共享文件   之前写了 ...

  7. 【Linux】windows下编写的脚本文件,放到Linux中无法识别格式

    注意:我启动的时候遇到脚本错误 » sh startup.sh -m standalone tanghuang@bogon : command not found : command not foun ...

  8. 在MVVMLight框架的ViewModel中实现NavigationService

    网上已经有很多方法了,比如通过Messenger来实现等等.这里我只讲述一种我比较喜欢的方法,因为它很方便 首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类.在基类中定义 ...

  9. Windows 在命令行中将输出内容放到文件中

    1.将命令行中输出的内容存储到文件中. 使用重定向符号 “>” 就可以了. 通过 > 可以创建新文件并将内容放到文件中,如果文件存在,则会覆盖. 2.通过 >> 可以向已有的文 ...

随机推荐

  1. IO-02

    /** 2 *A2-IO-02. 整数四则运算(10) 3 *C语言实现 4 *测试已通过 5 */ #include "stdio.h" #include "stdli ...

  2. 在表单(input)中id和name的区别

    但是name在以下用途是不能替代的:1. 表单(form)的控件名,提交的数据都用控件的name而不是id来控制.因为有许多name会同时对应多个控件,比如checkbox和radio,而id必须是全 ...

  3. 实现拦截API的钩子(Hook)

    道理不多讲,简单说就是将系统API的跳转地址,替换为我们自己写的API的地址,所以要求我们自定义的API函数要和被拦截的API有相同的参数.在用完后,记得恢复. 因为要挂全局的钩子,所以Hook的部分 ...

  4. 一步一步实现AS3拖放组件

    外话: 我之前在天地会上发布过一个拖放组件,http://bbs.9ria.com/thread-117535-1-1.html 应该有人看过吧,那时候年纪轻轻,写了个东西,那时候基本能满足需求 但是 ...

  5. Redis事务和分布式锁

    Redis事务 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MUL ...

  6. ios 后台模式

    1.在后台可以继续播放音频 To play sound in the background, make sure to add the following to the Info.plist file ...

  7. MySQL存储过程的基本函数

    (1).字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2 [,... ]) //连接字串 INSTR (string ,substring ) //返回subst ...

  8. Codeforces Round #258 (Div. 2/C)/Codeforces451C_Predict Outcome of the Game(枚举)

    解题报告 http://blog.csdn.net/juncoder/article/details/38102391 题意: n场比赛当中k场是没看过的,对于这k场比赛,a,b,c三队赢的场次的关系 ...

  9. html5滑动手势

    <div id="divMove" style="height: 100px;"></div> <div id="sli ...

  10. 配置Nutch模拟浏览器以绕过反爬虫限制

    原文链接:http://yangshangchuan.iteye.com/blog/2030741 当我们配置Nutch抓取 http://yangshangchuan.iteye.com 的时候,抓 ...