Caliburn Micro框架快速上手(WP)
一、使用nuget添加起始工程

二、修改App.xaml文件和App.xaml.cs文件
AppBootstrapper介绍:
AppBootstrapper根据中文的直译可以看出来此类的大概的作用,但笔者总结为:
1、负责接管程序生命周期中的事件(Lunch Deactivate等)
2、配置IOC容器
3、添加自定义的命名协定
1、负责接管程序生命周期中的事件:
之前的app生命周期相关的操作在AppBootstrapper里面可以通过重载找到,因此若程序原来逻辑中存在处理,放到对应的函数中即可

2、配置IOC容器:

CM框架中自带了一个容器,叫做PhoneContainer,很简洁的容器,提供了一系列的函数用来配置,如果希望使用其他容器,那么可以在AppBootstrapper中进行修改和配置 Container介绍
3、添加自定义命名协定:
CM有一套自动binding机制,可以根据控件的Name对应到VM中的属性上,并将控件设定的属性Binding到VM中对应的属性上。举个例子:
对于TextBox而言x:Name若设定为Title,那么便会自动将Textbox的Text属性自动Binding到TextBox的DataContext所在的VM的Title属性上(如果存在)
当然如果不喜欢这种方式,使用原始的Binding也是支持的。(笔者建议使用Text={Binding Title}更具可读性)
三、CM的View和ViewModel自动Binding机制
CM会根据内置的View、ViewModel 命名协定(Conventions)寻找View/ViewModel
具体的协定内容如下:
|
|
ViewModel |
View |
|
Convention |
<EntityName>ViewModel |
<EntityName>View |
|
举例 |
TabViewModel |
TabView |
|
Convention |
<EntityName>PageViewModel |
<EntityName>Page |
|
举例 |
OrderPageViewModel |
OrderPage |
|
Convention |
<RootNS>.<ViewModelTypeName> |
<RootNS>.<ViewTypeName> |
|
举例 |
MyProject.MainPageViewModel |
MyProject.MainPage |
|
Convention |
<RootNS>.ViewModels.[<ChildNS>].<ViewModelTypeName> |
<RootNS>.Views.[<ChildNS>].<ViewTypeName> |
|
举例 |
MyProject.ViewModels.ShellViewModel |
MyProject.Views.ShellView |
|
|
MyProject.ViewModels.Utilities.SettingsViewModel |
MyProject.Views.Utilities.SettingsView |
四、CM的页面导航处理
关键类:
UriBuilder
工作原理:
此类为一个Builder类用来构建导航的Uri。并根据View-ViewModel协定,根据ViewModel找到对应的View路径,然后进行导航。
主要方法:
|
WithParam |
将传入的参数和值写入到类内部的字典中 |
|
Navigate |
调用内部BuildUri方法,将之前字典中的键值对序列化成导航参数,根据ViewModel找到View路径,然后调用INavigationService接口定义的导航方法 |
FrameAdapter
CM内部实现了FrameAdapter这个类这个类的核心功能为:
1、Hook 程序的Frame的导航事件,Navigating,Navigated
2、在Navigating触发的时候
判断上一个页面的DataContext是否实现了IGuardClose和IDeactivate接口,若实现了IGuardClose接口,则根据接口中定义的CanClose来决定是否取消这次导航。若实现了IDeactive接口,则调用触发上一个页面的DataContext的Deactivate方法,具体代码在后面。
3、在Navigated触发的时候
|
通过反射调用页面的构造方法(因此xaml.cs文件甚至可以删除掉) |
|
根据当前页面,根据View-ViewModel协定找到对应的ViewModel,将当前页面的DataContext设置为对应的ViewModel。 |
|
根据导航串中参数将参数注入到ViewModel中对应的属性上 |
|
根据命名协定对页面的子元素分别进行Binding |
|
若ViewModel实现了IActivite接口,同时调用Activate |
以上介绍可以到CM的主页上找到源码进行更进一步的查看,并加深理解
明白上述两个类的职责之后,那么当我们使用CM框架进行导航的时候,就可以清楚的了解CM是如何实现根据VM找到View然后导航,并且将对应的属性赋值上去了。
如果对CM框架有任何问题欢迎加入
Caliburn Micro框架快速上手(WP)的更多相关文章
- Caliburn Micro框架
Caliburn Micro框架快速上手(WP) 一.使用nuget添加起始工程 二.修改App.xaml文件和App.xaml.cs文件 AppBootstrapper介绍: AppBootst ...
- Caliburn.Micro - 框架搭建
简介:Caliburn.Micro是Caliburn的一个轻量级版本开源架构,可以用于wpf,sliverlight,wp7等,和注重模块化的Prism比起来也有许多优点,具体比较可以参考 此文 ht ...
- Caliburn.Micro框架之Action Convertions
首先新建一个项目,名称叫Caliburn.Micro.ActionConvertions 然后删掉MainWindow.xaml 然后去app.xaml删掉StartupUri这行代码 其次,安装Ca ...
- Caliburn.Micro框架之Bindings
新建一个WPF项目,将其命名为Caliburn.Micro.BindingsDemo 其次安装Caliburn.Micro,安装Caliburn.Micro的同时也会安装Caliburn.Micro. ...
- Activiti工作流框架——快速上手
一.前言 最近在做公司的OA,里面有用到工作流,公司用的是 jbpm4,感觉比较老,资料有点少,就先学学 新一点的 activiti ㄟ(▔▽▔)ㄏ 首先工作流的概念是:工作流(Workfl ...
- WPF +MVVM(Caliburn.Micro)项目框架
最近做了一个软件,这个软件不是网站,但是与HTML,AJAX等技术密切相关,也不是只有单纯的数据库增删改查,还涉及到线程协调,比较复杂的文本处理…… 这样的软件,用OA,ERP的框架显然是不合适的,因 ...
- [Caliburn.Micro专题][1]快速入门
目录 1. 什么是Caliburn.Micro? 2. 我是否需要学习CM框架? 3. 如何下手? 3.1 需要理解以下几个概念: 3.2 工程概览 3.3 示例代码 开场白:本系列为个人学习记录,才 ...
- 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器
从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...
- [WPF] Caliburn Micro学习二 Infrastructure
Caliburn Micro学习一 Installation http://blog.csdn.net/alvachien/article/details/12985415 Step 1. 无论是通过 ...
随机推荐
- powerdesigner 16.5 破解步骤
假设你的PowerDesigner已经安装完成.(PowerDesigner下载地址:http://pan.baidu.com/s/1mgqjmpa) 1. 从网上下载PowerDesigner165 ...
- PHP免费的空间www.hostinger.co.uk
免费的PHP空间:http://hostinger.co.uk hostinger是一个免费的PHP空间,不仅100%完全免费而且还没有广告,提供2G物理空间和100GMysql空间 可以一键安装Wo ...
- MyReport报表引擎2.1.0.1新功能
MyReport报表引擎(免Flex开发集成版)的使用场合适用于以传统html构建的系统,希望集成MyReport报表引擎的报表预览.打印和报表设计功能,而且不须要进行Flex相关的二次开发的用户.M ...
- Service 生命周期
有了 Service 类我们如何启动他呢,有两种方法: • Context.startService() • Context.bindService() 1. 在同一个应用任何地方调用 start ...
- java实现顺序链表
C&C++是那么难学,以至于我连指针是什么都不知道.所以只能学习java了. 如今想用java实现N年前学过“数据结构(c语言版)”却又是那么吃力! 慢慢练吧! 写此博客,仅标记自己学过数据结 ...
- js Object.is 相等判断
Object.is使用“Same-value equality”(同值相等)算法进行相等判断.它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致. Object.is('foo', ...
- centos6.5下使用yum完美搭建LNMP环境(php5.6,mysql5.5,nginx1.10)
准备工作 配置防火墙,开启80端口.3306端口 不用执行这句:rm -rf /etc/sysconfig/iptables 直接进入修改:vi /etc/sysconfig/iptables 添加8 ...
- PHP-流的概念与详细用法
Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数.Stream可以翻译为“流”,在Java里,流是一个很重要的 ...
- Yii::记录日志到自定义文件
默认情况下,Yii::log($msg, $level, $category)会把日志记录到runtime/application.log文件中 日志格式如下: [时间] - [级别] - [类别] ...
- Linux-软件包管理-RPM安装位置\源码包安装位置
rpm -ql httpd 查看apache包中文件的安装位置 find /etc -name httpd 查找apache程序的启动执行httpd所在位置 cd /etc/rc.d/init.d 切 ...