C# WPF MVVM开发框架Caliburn.Micro入门介绍①

01

Caliburn.Micro简介

Caliburn.Micro是一套基于XAML的MVVM模式的开发框架,它小巧而强大。在CaliburnMicro中只需要按照约定把View的名字加上后缀ViewModel,就是它的View Model 的名字,如:MainPage和 MainPageViewModel。Caliburn.Micro自动把ViewModel绑定到View的DataContext。如果ViewModel 的属性名和控件的名称相同,那么就会自动绑定上。

MVVM 简介

MVVM源于微软的软件开发架构模式。MVVM的开发基于事件驱动,实现UI层和逻辑层的分离,从而使UI设计人员和程序员各施其职。MVVM中的View Model在Model和View之间扮演着值转换器的角色,把Model的数据交给View去绑定,把View的数据提交给Model;同时也要实现mediator设计模式,成为View和Model之间的逻辑协调者。

02

以下是一个关于Caliburn.Micro简短的列表:

Action消息:

操作机制允许您将UI触发器(如按钮的“单击”事件)“绑定”到视图模型或演示器上的方法。该机制还允许向方法传递参数。参数可以数据绑定到其他框架元素,也可以传递特殊值,例如DataContext或EventArgs。所有参数都会自动转换为方法的签名。此机制还允许“Action.Target”独立于DataContext而变化,并允许在UI中的不同点从触发器声明它。当触发器发生时,“消息”在元素树中冒泡,寻找能够调用指定方法的Action.Target(处理程序)。这就是为什么我们称之为信息。动作消息的“冒泡”特性非常强大,非常有用,尤其是在主/细节场景中。除了调用之外,该机制还支持“CanExecute”保护。如果该操作具有同名的相应属性或方法,但前面有“Can”一词,则该操作的调用将被阻止,UI将被禁用。操作还支持协同路由(见下文)。这对于现有的Caliburn用户来说都是相当标准的,但是我们在Caliburn.Micro上做了一些改进,这将进入更大的框架。ActionMessages的Caliburn.Micro实现构建在System.Windows.Interactivity上。这允许由社区开发的任何TriggerBase触发操作。此外,Caliburn.Micro的动作在Blend中有充分的设计支持。以代码为中心的开发人员会很高兴知道Caliburn.Micro支持非常简洁的语法,通过一个名为Message.Attach的特殊附加属性来声明这些ActionMessages。

Action 约定

开箱即用,我们支持围绕ActionMessage特性的一组绑定约定。这些约定基于x:Name。因此,如果您在ViewModel上有一个名为“Save”的方法,在UI中有一个名为“Save”的按钮,我们将自动为“Click”事件创建一个EventTrigger,并为“Save”方法分配一个ActionMessage。此外,我们将检查方法的签名并正确构造ActionMessage参数。可以关闭或自定义此机制。您甚至可以更改或添加不同控件的约定。例如,如果您确实需要,您可以为按钮“MouseMove”而不是“Click”创建约定事件。

Binding 约定

我们还支持基于约定的数据绑定。这也适用于x:Name。如果ViewModel上的属性与元素同名,我们将尝试对其进行数据绑定。虽然框架了解操作的约定事件,但它还了解约定绑定属性(您可以自定义或扩展)。当绑定名称匹配时,我们将继续执行几个步骤来构建绑定(所有这些步骤都是可自定义的),配置诸如BindingMode、StringFormat、ValueConverter、Validation和UpdateSourceTrigger(也适用于SL TextBox和PasswordBox)等详细信息。最后,我们支持为某些场景添加自定义行为。这允许我们根据命名模式检测是否需要自动生成数据模板或连接选择器的ItemsSource和SelectedItem。

Screens 和Conductors

Screen、ScreenConductor和ScreenCollection模式支持基于模型的活动或当前项目跟踪,强制执行屏幕生命周期,并在应用程序中优雅地关闭或取消关闭。Micro对这些模式的实现是Caliburn中的模式的演变,支持执行任何类型的类,而不仅仅是IScreen的实现。这些改进正在重新引入Caliburn。你会发现Caliburn.Micro的屏幕实现非常彻底,甚至可以轻松处理异步关机场景。

Event Aggregator(事件聚合器)

Micro的EventAggregator简单而强大。聚合器遵循总线样式的发布/子模型。您向聚合器注册了一个消息处理程序,它会向您发送您感兴趣的任何消息。您可以通过实现IHandle来声明您对特定消息类型的兴趣。对处理程序的引用被弱持有,发布发生在UI线程上。我们甚至支持多态订阅。

Coroutines协同程序

任何操作都可以选择返回IResult或IEnumerable,这为处理异步编程的强大方法打开了大门。此外,IResult的实现可以访问执行上下文,该上下文告诉它们执行的是什么ActionMessage、哪个FrameworkElement触发了要发送的消息、ActionMessage由哪个实例处理(在上调用)以及该实例的视图是什么。这种上下文信息支持一种松散耦合的声明性机制,通过这种机制,演示者或视图模型可以与其视图进行通信,而无需在任何时候保持对视图的引用。

View 定位器

对于应用程序中的每个ViewModel,Caliburn.Micro都有一个基本策略来定位应该渲染它的视图。我们是根据命名约定来做这件事的。例如,如果您的VM名为MyApplication.ViewModels.ShellViewModel,我们将查找MyApplication.Views.ShellView。此外,通过在Xaml中附加View.Context,我们支持同一视图模型上的多个视图。因此,给定与上面相同的模型,但使用View.Context=“Master”我们将搜索MyApplication.Views.Shell.Master。当然,所有这些都是可定制的。

View Model 定位器

尽管Caliburn.Micro支持ViewModel First方法,但我们也通过提供与ViewLocator具有相同映射语义的ViewModelLocator来支持View First。

Window Manager窗口管理器

此服务提供以视图模型为中心的窗口显示方式(Silverlight中的ChildWindow、WPF中的Window、Windows Phone中的自定义本机样式主机)。只需向它传递一个VM实例,它就会找到视图,必要时将其包装在窗口中,应用您配置的所有约定并显示窗口。

PropertyChangedBase 和BindableCollection

如果没有INotifyPropertyChanged的基本实现,什么自尊的WPF/SL框架可以实现?Micro实现支持基于字符串和lambda的更改通知。它还确保在UI线程上引发所有事件。BindableCollection是一个简单的集合,它继承自ObservableCollection,但也确保在UI线程上引发其所有事件。

Bootstrapper引导程序

配置此框架并使其启动和运行需要什么?不多只需从Bootstrapper继承并将自定义Bootstrapper的实例添加到应用程序的ResourceDictionary中。完成。如果需要,可以重写一些方法来插入自己的IoC容器,声明应该检查哪些程序集的视图,等等。这非常简单。

Logging

Caliburn.Micro实现了一个基本的日志抽象。这在任何鼓励约定而不是配置的严肃框架中都很重要。该框架的所有最重要部分都包含日志记录。想知道应用或不应用哪些约定吗?打开日志记录。想知道正在执行哪些操作吗?打开日志记录。想知道正在发布哪些事件吗?打开日志记录。你明白了。

MVVM 和MVP

如果不明显,这个框架支持MVVM。MVVM本身并不难,但Caliburn.Micro努力超越简单的实现。我们希望编写优雅的、可测试的、可维护的和可扩展的表示层代码……我们希望这样做很容易。这就是为什么。如果您更喜欢使用监控控制器和被动查看而不是MVVM,请继续。你会发现Caliburn.Micro可以帮助你很多,特别是它的Screen/ScreenConductor实现。如果你对我刚才提到的任何目标都不感兴趣,你最好继续前进。这个框架不适合你。

要清楚的是,这不是一个玩具框架。正如我所说,我真正关注的是支持Caliburn v2的核心和最常用的功能。事实上,Caliburn.Micro将是我前进的默认框架,我建议,如果你开始一个新项目,你就从Micro框架开始。我一直很小心地使ApplicationDeveloperAPI与Caliburn的完整版本保持一致。事实上,我在Caliburn.Micro中所做的改进正在被重新折叠到Caliburn v2中。那有什么好处?您可以开始使用Caliburn.Micro进行开发,然后,如果您遇到边缘情况或有其他需要转移到Caliburn,您将能够在应用程序中进行少量更改或不进行任何更改。

原文标题:Caliburn.Micro Xaml made easy

原文链接:https://caliburnmicro.com/documentation/introduction

翻译:dotnet编程大全

C#技术群 : 添加小编zls20210502,备注:进群!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度分析 Java 的 ClassLoader 机制(源码级别)(转)

写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoader的loadClass&am…

Struts2和Struts1的不同

转载(没看懂) Action 类 ◆Struts1要求Action类继承一个抽象基类org.apache.struts.action.Action。Struts1的一个普遍问题是使用抽象类编程而不是接口。 ◆Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定…

拉屎能赚钱?在马桶上月入过万?原来卫生间里还有这么多隐藏福利,超模君都惊了……

全世界只有3.14 % 的人关注了爆炸吧知识模友们,你们有过“带薪拉屎”的经历吗?没错,假如我们每天花10分钟“带薪拉屎”,那一年大概能积攒下来40小时,假如我们每天工作8小时,等于多了5天年假,白嫖…

Android之让图片匀速旋转效果

图片匀速旋转 当我们更新的时候,需要把更新小图标旋转起来,不废话,先爆照 介绍动画: Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先…

C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?

我定义a^bab(10a b)^2 100a^2 20ab b^2 100a^2 b(20a b)a代表已经计算结b代表前需要计算位数每计算程100a^2都减掉剩b(20a b)需要做找整数b使b(20a b)>b,(10*a b)^n-(10*a)^n≈n*(10*a)^(n-1)*b,即:b≈41221398234/n/(10*a)^(n-1)41221398234/5/180^4≈7。85,取b7各步都更…

百度语言翻译机

百度语言翻译机 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 1s 百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈,会议,甚至在各中技术文档中都…

Android之如何使用快速联系徽章

翻译地址:http://code.tutsplus.com/tutorials/android-quick-tip-using-the-quick-contact-badge--mobile-2245 如果你花任何时间在一个Android设备,您可能已经注意到你可以点击小图片联系如何启动一个工具栏与很多不同的行为,如电话、短信、邮件的人。 在这个快速提示,您…

dotnet 使用 Infer# 自动分析代码缺陷

本文告诉大家如何使用 Infer# 开源库配合 GitHub 的 Action 实现自动分析代码缺陷,如找到可空引用或线程安全等问题这是一个在 GitHub 上完全开源的仓库,请看 https://github.com/microsoft/infersharp刚好今天收到了 Infer# 发布 1.2 版本博客&#xff…

发了篇paper,双非二本的她直博浙大

全世界只有3.14 % 的人关注了爆炸吧知识大家好,我是小南,本科就读于国内某双非二本院校,于2019年拿到了浙江大学的直博录取函。很多人问我从二本院校成功跨越到国内知名高校的秘诀是什么,我个人觉得,除开运气&#xff…

FZU 2095 水面高度

一共六种情况。手算即可。 #include<cstdio> #include<cstring> #include<cmath>int T; double a,b,c,d,x; double ans;int main() {scanf("%d",&T);while(T--){scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&x);doubl…

android+清除循环动画,android - 如何使用ViewPropertyAnimator生成循环动画?

我想构建一个TextViews动画&#xff0c;在完成后会自动重复。对于我要设置动画的每个View&#xff0c;我使用以下代码final float oldX v.getX();final float newX v.getX() - (float)totalWidth;final AnimatorListenerAdapter listener new AnimatorListenerAdapter() {Ov…

(转)matlab各类数学公式

matlab矩阵应用clear%建立矩阵的两种方式A1 [1 2 3 4 5; 6 7 8 9 10];A2 [ 1 2 3 4 5 6 7 8 9 10 ];%一种是换行用引号&#xff0c;一种是自然写法 clearA [5 4 3 2 1; 6 7 8 9 10;1 2 3 4 5;24 24 24 24 24;25 25 25 25 25];B [5 4 3 2 1; 6 7 8 9 10;…

PS网页设计教程XVI——在PS中创建一个摩登实验室风格的网页设计

作为编码者&#xff0c;美工基础是偏弱的。我们可以参考一些成熟的网页PS教程&#xff0c;提高自身的设计能力。套用一句话&#xff0c;“熟读唐诗三百首&#xff0c;不会作诗也会吟”。 本系列的教程来源于网上的PS教程&#xff0c;都是国外的&#xff0c;全英文的。本人尝试翻…

好评率超高的9个公众号,值得收藏

不管世界变化多快&#xff0c;阅读仍是个不过时的动作。今天就为大家推荐几个优质公众号&#xff0c;从社会热点、读书成长、生活新知&#xff0c;你的碎片化时间&#xff0c;我们包了&#xff01;一起来看看呀~长按二维码&#xff0c;“识别图中二维码”即可订阅————电商头…

.NET 6新特性试用 | 文件范围的命名空间

前言在前面的《隐式using指令》文章中&#xff0c;我们介绍了global using&#xff0c;可以减少我们代码文件中的“噪音”&#xff0c;使代码更简洁。今天&#xff0c;我们介绍.NET 6中另一个简化代码的方式——文件范围的命名空间。Demo当我们向项目中添加一个类文件时&#x…

php的几种运行模式CLI、CGI、FastCGI、mod_php

1、CLI:就是命令行&#xff0c;例如可以在控制台或者是shell中键入命令: php -f index.php 然后获取输出 2、CGI:以下是不同的说法与理解 公共网关接口”(Common Gateway Interface)&#xff0c;HTTP服务器 与你的或其它机器上的程序 进行 “交谈”的一种工具 &#xff0c;其程…

Android之三大图片缓存原理、特性对比

一. 四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存&#xff0c;在早期被很多应用使用。Picasso 是 Square 开源的项目&#xff0c;且他的主导者是 JakeWharton&#xff0c;所以广为人知。Glide 是 Google 员工的开源项目&#xff0c;被一些 Google App 使用…

android宿舍管理系统源码,基于android操作系统的手机宿舍管理系统使用手册

《基于android操作系统的手机宿舍管理系统使用手册》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《基于android操作系统的手机宿舍管理系统使用手册(5页珍藏版)》请在人人文库网上搜索。1、基于an droid操作系统的手机宿舍管理系统使用手册 1 系统概述 本系统是在an…

产品需求文档 PRD

第一轮&#xff1a; 1&#xff0c;文档使用方&#xff1a;UI设计师 2、内容&#xff1a; 根据战略层定义出来产品功能范围&#xff0c; 说明此产品的目的&#xff0c;方便UI设计人员更好的理解产品 产品基本流程 详细的设计框架图&#xff0c;推荐用ax…

他读博期间连发3篇Science,28岁任武大教授后再发Nature!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;募格课堂整合自武汉大学、武汉晚报、半月谈等有这样一位学者&#xff0c;读博期间以一作身份发表3篇Science,28岁成为武汉大学化学与分子科学学院教授再发2篇Nature&#xff0c;35岁荣获杰青......今年9月&#xff0c;他…