Xamarin 的 MVVM 之 Caliburn.Micro
约定
Caliburn.Micro 以下简称 CM
Xamarin.Form 以下简称 XF
摘要
CM 当前已释出 3.0 beta 版
https://github.com/Caliburn-Micro/Caliburn.Micro/tree/3.0.0
对 Xamarin 做了很多支持.
本文主要探索一下, XF 下如何使用 CM, 其它方面不做深入研究.
示例地址:
https://github.com/gruan01/Xamarin-Example/tree/master/CMTest
环境
在 Nuget 上, 已经有 CM 对 XF 的支持包:
Caliburn.Micro.Xamarin.Forms 3.0.0-beta1
这个包依赖于:
Caliburn.Micro.Core (= 3.0.0-beta1)
Xamarin.Forms (≥ 1.4.2.6355)
但是如果你只安装了上面这两个依赖, 编译是通不过的. 会提示:
无法加载: Caliburn.Micro.Platform.Core
当前这个 Platform.Core 在 Nuget 上是没有的, 需要自行下载 CM 的 3.0 beta 版, 编译,从而得到这个 dll
这里提供已编译的 DLL:
https://github.com/gruan01/Xamarin-Example/tree/master/CMTest/dll
Android 入口, Application
这个很简单, 主要是要在它里面实现一个 IoC 容器 SimpleContainer, 具体参考:
https://github.com/gruan01/Xamarin-Example/blob/master/CMTest/CMTest.Droid/Application.cs
WP 入口
这个稍微复杂一点:
1, 新建一个 Bootstrapper , 继承自 PhoneBootStrapperBase
它里面做的事情和 Android 下面的 Applicaton 做的事情基本一致, 也是要声明一个 IoC, 只不过是 SimpleContainer 的子类:
PhoneContainer, 这个类在 Caliburn.Micro.Extensions.dll 里.
除 Configure方法 和 Android 下的 Application 不一样外,其它都一样.
参考:
https://github.com/gruan01/Xamarin-Example/blob/master/CMTest/CMTest.WinPhone/Bootstrapper.cs
2, 修改 App.xaml 为以下的样子:
<Application x:Class="CMTest.WinPhone.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:CMTest.WinPhone" > <Application.Resources> <local:Bootstrapper x:Key="Bootstrapper" /> </Application.Resources> </Application>
3, 修改 App.xaml.cs 为如下:
public partial class App {
public App() {
this.InitializeComponent();
}
}
IOS入口
暂缺
XF 项目的 App
https://github.com/gruan01/Xamarin-Example/blob/master/CMTest/CMTest/App.cs
1,需要继承自 FormsApplicaton
2,构造函数中需要加上 SimpleContainer 类型的参数.
3,用 SimpleContainer 注册相关的 ViewModel 为 PerRequest 或 Singleton,
当然也可以不注册, 如果不注册的话, 在使用 INavigationService.For<xxx>.Navigate 的时候,相关 ViewModel 不会被实例, 作者是这样解释
的:
https://github.com/Caliburn-Micro/Caliburn.Micro/issues/182#issuecomment-132356227
The navigation service uses the view model locator to find the appropriate view model, this in turn uses IoC.
If you're not wanting to use dependency injection and all your view models have parameterless constructors then you can pull
out all of the container code and the framework will just new up the view model.If you want to use dependency injection then you can choose to use the SimpleContainer that comes with Caliburn or your
container of choice instead.The behavior of SimpleContainer is to return null when being asked for a instance it doesn't know about (hence the
registration). Other containers have different behavior for this, it's up to you which you want to use.
Navigation Service 使用 IoC 中注册的 View Model ,不注册当然是视为你要自己实例化相关 View Model.
其实我提这个问题的目的是想如果加上默认注册 View Model 的功能, 那就在好不过了. 当然了, 我并没有深入了解 CM, 所以只能哈哈了.
绑定语法
使用过 CM 的, 对它提供的绑定方式一定很赞, 控件的 x:Name 只要和 ViewModel 中的提供的 属性 或 方法名一致, 就可以自动绑定, 如:
...
public string UserName{get;set;}
...
<TextBlock x:Name="UserName" />
会自动绑定 UserName 到 Text 上.
..
public void DoSomthing(){
...
}
...
<Button x:Name="DoSomthing" Content="XXX" />
会自动绑定 button 事件到 DoSomthing 方法上.
但是 XF 的对象不能通过 x:Name 获取到, 所以无法使用上面的特性, 要实现绑定, 只能用这下面的方式:
1, 数据绑定 XXX="{Binding xxx}"
2, 事件绑定 cm:Message.Attach="xxx"
http://caliburnmicro.com/announcements/
There is no programmatic access to x:Name in Xamarin.Forms, therefore the feature of name based conventions will not be
available, you will need to use normal {Binding Username} and cm:Message.Attach="SignIn".
这一点, 希望 Xamarin 能在后期的版本中提供支持.
子视图
如果你使用过 CM ,那一定对另外一个功能也很赞:
<ContentControl x:Name="SubVM" />
只要 ViewModel 中存在这个 SubVM , 就会把它对应的 View 给展示出来.
在 XF 中, 也支持这个功能, 不过要这样写:
<ContentView cal:View.Model="{Binding VM}" />
具体参见:
https://github.com/gruan01/Xamarin-Example/blob/master/CMTest/CMTest/ViewModels/UserInfoViewModel.cs
看一下动态切换子视图的效果:

怎么样?是不是想拿它来做个单页应用?
Xamarin 的 MVVM 之 Caliburn.Micro的更多相关文章
- WPF MVVM(Caliburn.Micro) 数据验证
书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model端验证,Model通过继承IDataErrorInfo接口来 ...
- WPF +MVVM(Caliburn.Micro)项目框架
最近做了一个软件,这个软件不是网站,但是与HTML,AJAX等技术密切相关,也不是只有单纯的数据库增删改查,还涉及到线程协调,比较复杂的文本处理…… 这样的软件,用OA,ERP的框架显然是不合适的,因 ...
- 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器
从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...
- MVVM Caliburn.Micro学习记录
wpf中MVVM一直用的自己写的框架,最近试了试Caliburn.Micro. Caliburn.Micro可以通过x:name来进行属性和事件绑定. 比如 <Button x:Name=&qu ...
- Caliburn.Micro(MVVM框架)
一.首启窗体设置 1. 创建一个新的WPF应用程序并添加NuGet包:Caliburn.Micro 2. 删除项目自带的主窗口文件MainWindow.xaml 3. 在App.xaml项目文件中,删 ...
- Caliburn.Micro学习笔记(一)----引导类和命名匹配规则
Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...
- Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能
Caliburn.Micro学习笔记目录 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双 ...
- Caliburn.Micro 关闭父窗体打开子窗体
比如我们在做登录的时候需要关闭父窗体打开子窗体.使用Caliburn.Micro它的时候我们关闭登录窗口的时候主页面也会关闭. 解决方法就是在登录页面的CS里面写 IndexView iv = new ...
- AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)
随着IOS7由之前UI的拟物化设计变为如今的扁平化设计,也许扁平化的时代要来了,当然我们是不是该吐槽一下,苹果什么时候也开始跟风了,自GOOGLE和微软界面扁平化过后,苹果也加入了这一队伍. Aval ...
随机推荐
- Java中的 WeakReference 和 SoftReference
我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...
- CI框架SESSION重写
这个是我平时用的是 PHP 自己的 Session 机制,是真正的 PHP Session,存储在服务器端,而不是用的 cookie 接口完全兼容于 CI 2.0.x 的 Session 类库,也就是 ...
- Apache CXF自定义拦截器
为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- hdu 2196 Computer 树形dp模板题
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- linux 删除已输入的命令行
ctrl + w —往前删除一个单词,光标放在最末尾ctrl + k —删除到末尾,光标放在最前面(可以使用ctrl+a) —————————————————————-华丽的分割线ctl + u 删除 ...
- Kafka原理与java simple producer示例
brokers和消费者使用zk来获取状态信息和追踪消息坐标. 每一个partition是一个有序的,不可变的消息序列. 只有当partition里面的file置换到磁盘文件以后,才开放给消费者来消费. ...
- Oracle Jdbc demo
两种方式: thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,只要求classpath中包含jdbc驱动的jar包就行.thin就是纯粹用Java写的ORACLE数据库 ...
- java在url传输前更改字符编码
几种方式 1. String s = "sds"; s = new String(data_id.getBytes("UTF-8")); 2. 使用get请求 ...
- 【MVC 4】7.SportsSore:完成购物车
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> 本文将继续构建 SportsStore 示例应用程序.在上一章中,添加了对购物车的基本支持,现在打 ...