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 为以下的样子:

 1 <Application
 2 x:Class="CMTest.WinPhone.App"
 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 5 xmlns:local="clr-namespace:CMTest.WinPhone"
 6 >
 7
 8 <Application.Resources>
 9 <local:Bootstrapper x:Key="Bootstrapper" />
10 </Application.Resources>
11 </Application>

3, 修改 App.xaml.cs 为如下:

1 public partial class App {
2
3 public App() {
4 this.InitializeComponent();
5 }
6
7 }

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
看一下动态切换子视图的效果:

怎么样?是不是想拿它来做个单页应用?

时间: 2024-08-01 16:13:28

Xamarin 的 MVVM 之 Caliburn.Micro的相关文章

MVVM框架 -- Caliburn.Micro 系列文章

Caliburn.Micro 项目文档(翻译):Screens, Conductors and Composition Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介 Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器 Caliburn.Micro 杰的入门教程4,事件聚合器 Caliburn.Micro 杰的入门教程3,事件和参数 Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和

从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(Caliburn.Micro框架概述 - https://blog.csdn.net/lzuacm/article/details/78886436) 是一个轻量级的WPF框架,简化了WPF中的不少用法,推荐做WPF开发时优先使用. 真正快速而熟练地掌握一门技术就可以尝试着用最快的

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

使用Caliburn.Micro系列2:Convention

CM中实现一个比较有意思的特性,就是智能匹配. 通常使用MVVM的写法:在匹配 View和ViewModel时会使用DataContext,在匹配数据属性时使用Binding,在匹配事件命令时使用Command. 而CM通过ElementConvention 实现它们的自动匹配,只需要遵循指定的命名规则[可自定义].由于一个控件的事件有多种(比如:Button:Click,MouseEnter等等),CM提供了最常用的事件的绑定,可根据具体需求自定义. 自动绑定演示: 在View中添加如下代码:

Caliburn.Micro开发框架介绍 -- Windows phone

Caliburn.Micro开发框架介绍 Caliburn是一套基于XAML的开发框架,它小巧而强大.利用它不但能提高开发效率,还可以提高XAML程序开发的可维护行.可扩展性和可测试性.Caliburn.Micro则是专门针对Windows phone开发的版本. MVVM简介 MVVM源于微软的软件开发模式,可以粗略的认为它是MVC模式的发展,原来Controller的职能被拆分,其中值转换器(Value Converter)和绑定器(binder)已经由框架实现,程序员可以更关注在逻辑实现上

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif