从MEF谈起
说起Caliburn就不得不先说说MEF框架,因为Caliburn在很多地方上用到了这个模型。
MEF(Managed Extensibility Framework)是.net 平台下的一个框架,全称托管扩展框架,是将.net下的代码进行组件式组合而设计的,MEF的具体内容我会再详细去写,本次内容重点并非它,这里我们只是介绍下,MEF框架支持两类操作,Import and Export, 这两类操作是很重要的组件功能, 将一个类视为一个松耦合的组件, 这个类可以从一个接口派生, 然后Export成接口的形式。 这样,Import组件时, 就可以使用该类的实例化对象了。 Caliburn中大量使用此组件模型,众多的类的组合,大部分都导出成了对应的接口的模式进行组合,我们在开发时,也可以继续使用。Caliburn的消息响应
这句话就是了,cal:Message.Attach="Save"就将当前的默认消息绑定到了ViewModel中的void Save()
函数中了。另外,cal作用域要手动添加:xmlns:cal="http://www.caliburnproject.org"
Caliburn开启新窗口
public void Save() { windowManager.ShowWindow(new WindowViewModel()); }
WindowManager
[Export(typeof(IShell))]public class ShellViewModel : Screen,IShell{ readonly IWindowManager windowManager; [ImportingConstructor] public ShellViewModel(IWindowManager windowManager) { this.windowManager = windowManager; } public void Save() { windowManager.ShowWindow(new WindowViewModel()); } public bool CanSave() { return true; }}
这里的CanSave函数会自动被绑定为,判读Save功能是否能使用上,如果不能,上面绑定的按钮也会自动变为灰色
各组件简介
Caliburn中的ActionMessages是整个框架的精髓,可以自动的绑定值,并且可以传递值,非常方便快捷。
Action Conventions提供了一系列默认的绑定策略,例如XXXView自动绑定到XXXViewModel,
如果有一个按钮Name=Save,其ViewModel中又有一个Save方法,那么这个按钮的Click事件就会默认绑定到这个函数上去。更方便的是,你还可以设计公约,使得其他公约绑定可以实现。Binding Conventions使得属性也可以自动绑定,如何一个子元素的名字和其ViewModel中的属性名字相同,系统会试图绑定它们。并支持用户设置自己的自动绑定。
Screen, ScreenConductor and ScreenCollection 可以使得基于模型的跟踪活动元素,强制生命周期,优雅的结束应用程序等
EventAggregator 是一个基于pub/sub模型的管理器,你首先要注册一个message handler, 然后他就会发给你任何你想要监听的消息,甚至支持多态。要声明一个感兴趣的message,需要在UI线程中调用 IHandle<TMessage>
。