C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①

使用名称Transformer

NameTransformer是在Caliburn.Micro v1.1中引入的,它是ViewLocator和ViewModelLocator如何将类名映射到其伙伴角色的一个组成部分。虽然您可以覆盖这些服务上的各种函数来替换底层行为,但您的大多数需求都应该通过使用适当的NameTransformer配置规则来满足,NameTransformer描述了您独特的映射策略。

名称转换基于使用正则表达式模式匹配的规则。执行转换时,将按顺序计算所有已注册的规则。默认情况下,NameTransformer返回所有匹配规则生成的结果名称。ViewLocator和ViewModelLocator类将使用结果名称列表按顺序检查AssemblySource.Instance集合中是否存在匹配类型。找到类型后,将忽略列表中的其余名称。尽管定位器类将始终最多返回一种类型,而不管NameTransformer返回的名称数量如何,但能够指定NameTransformer如何构造名称列表以更好地控制将定位的类型是很重要的。控制的主要手段是通过顺序。由于定位器类需要支持一些现成的类型命名约定,因此会自动添加一些默认名称转换规则。但是,为了能够支持自定义规则并允许它们优先于默认规则,NameTransformer按照与添加规则相反的顺序(LIFO)对规则进行求值。通常,您希望在更具体的规则之后评估更一般的规则。因此,在向NameTransformer添加规则时,必须首先添加更一般的规则,最后添加更具体的规则。要将NameTransformer返回的名称限制为第一个匹配规则生成的名称,可以将NameTransformer上的UseGuardRuleSelection属性设置为false。默认情况下,UseGuardRuleSelection设置为true。

自定义规则是通过调用ViewLocator和ViewModelLocator类维护的NameTransformer对象的AddRule()方法添加的。两个类都引用各自的NameTransformer静态实例,因此每个类都维护自己的一组规则。

呼叫约定如下:

public void AddRule(string replacePattern, IEnumerable<string> replaceValueList, string globalFilterPattern = null)

replacePattern:用于替换全部或部分输入字符串的正则表达式模式

replaceValueList:应用于replacePattern的字符串集合

globalFilterPattern:用于确定是否应计算规则的正则表达式模式。可选择的

public void AddRule(string replacePattern, string replaceValue, string globalFilterPattern = null)

replacePattern:用于替换全部或部分输入字符串的正则表达式模式

replaceValue:应用于replacePattern的字符串

globalFilterPattern:用于确定是否应计算规则的正则表达式模式。可选择的

为了说明如何使用此方法,我们可以查看ViewLocator类添加的一个内置规则:

NameTransformer.AddRule("Model$", string.Empty);

此转换规则查找终止ViewModel名称的子字符串“Model”,并去掉该子字符串(即替换为string.Empty或“null string”)。第一个参数中的“$”表示模式必须在源字符串的末尾匹配。如果“模型”存在于其他任何地方,则模式不匹配。由于此调用未包含可选的“globalFilterPattern”参数,因此此规则适用于所有ViewModel名称。

此规则产生以下结果:

4b77d3eaf3fd3a6a7034de6c847376d8.png

ViewModelLocator添加的相应内置规则为:

NameTransformer.AddRule(@"(?<fullname>^.*$)", @"${fullname}Model");

这个规则接受任何输入,并在末尾添加“Model”。此规则使用正则表达式捕获组,这在复杂转换中非常有用。“replacePattern”将视图的全名分配给名为“fullname”的捕获组,“replaceValue”将其转换为“Model”。

为了演示“globalFilterPattern”是如何应用的,我们可以看看ViewModelLocator的另外两个内置规则:

//Check for <Namespace>.<BaseName>View construct
NameTransformer.AddRule(@"(?<namespace>(.*\.)*)(?<basename>[A-Za-z_]\w*)(?<suffix>View$)",new[] {@"${namespace}${basename}ViewModel",@"${namespace}${basename}",@"${namespace}I${basename}ViewModel",@"${namespace}I${basename}"},@"(.*\.)*[A-Za-z_]\w*View$");//Check for <Namespace>.Views.<BaseName>View construct
NameTransformer.AddRule(@"(?<namespace>(.*\.)*)Views\.(?<basename>[A-Za-z_]\w*)(?<suffix>View$)",new[] {@"${namespace}ViewModels.${basename}ViewModel",@"${namespace}ViewModels.${basename}",@"${namespace}ViewModels.I${basename}ViewModel",@"${namespace}ViewModels.I${basename}"},@"(.*\.)*Views\.[A-Za-z_]\w*View$");

这两个调用的“globalFilterPattern”参数相同,只是在第二个方法调用的参数中添加了“Views.”。这表示仅当名称空间名称以“视图”(包括点)结尾时,才应应用该规则。如果模式匹配,则结果是ViewModel名称的数组,其命名空间以“ViewModels”结尾。

第一条规则回显原始名称空间不变,将涵盖所有其他情况。如前所述,首先添加最不特定的规则。它涵盖了当名称空间不以“视图”结尾时的失败情况。

当添加自定义的特定于应用程序的转换规则时,下面的替换模式应该非常有用。替换模式采用完全限定的ViewModel名称,并将其分成捕获组,这些捕获组应涵盖几乎所有转换:

(?<nsfull>((?<nsroot>[A-Za-z_]\w*\.)(?<nsstem>([A-Za-z_]\w*\.)*))?(?<nsleaf>[A-Za-z_]\w*\.))?(?<basename>[A-Za-z_]\w*)(?<suffix>ViewModel$)

例如,添加以下规则:

ViewLocator.NameTransformer.AddRule
(@"(?<nsfull>((?<nsroot>[A-Za-z_]\w*\.)(?<nsstem>([A-Za-z_]\w*\.)*))?(?<nsleaf>[A-Za-z_]\w*\.))?(?<basename>[A-Za-z_]\w*)(?<suffix>ViewModel$)",@"nsfull=${nsfull}, nsroot=${nsroot}, nsstem=${nsstem}, nsleaf=${nsleaf}, basename=${basename}, suffix=${suffix}"
);

将产生以下结果:

a6894e473985a0c1ae8fbbcb95db1ad3.png

笔记:

通过将“ViewModel$”更改为“View$”,上述相同的替换模式可用于ViewModelLocator。

您永远不会像上面的例子那样构造replace值,因为它会产生非法的类型名。它只是一个replace值,它将回显所有捕获组以供演示。

您可能会注意到,捕获组并不是相互排斥的。捕获组可以如示例中所示进行嵌套,以便“nsfull”捕获完整名称空间,“nsroot”、“nsstem”和“nsleaf”捕获该名称空间的各个组件。如果需要“交换”任何一个单独的组件,则可以使用单独的组件。

上面示例中的捕获组“后缀”对以“ViewModels”结尾的名称进行模式匹配。此捕获组的主要目的不是将其用作转换的一部分,因为ViewLocator的目的是解析视图名称。使用此捕获组的主要原因是防止子字符串“ViewModels”在“basename”组中被捕获,在大多数情况下,这是字符串转换的一部分。

02

最后

原文标题:Caliburn.Micro Xaml made easy

原文链接:https://caliburnmicro.com/documentation/name-transformer

翻译:dotnet编程大全

C#技术群 : 添加小编微信mm1552923,备注:进群!

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

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

相关文章

史上最可怜的科学家:出生先天不足,家道中落吃不上饭,追个星丢工作,拜师被冤枉,写书又被烧,最后还被拖工资活活拖死了......

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;小天来向各位模友介绍一个痴迷偶像正面刚的小迷弟吧。多病的贫家子&#xff0c;鲁莽的小迷弟1571年&#xff0c;开普勒在德国维尔镇呱呱落地了。作为一个善解人意的宝宝&#xff08;胚胎&#xff09;&#xff0c;开普勒没…

[zz]为 Lua 绑定 C/C++ 对象

转载自&#xff1a; http://blog.codingnow.com/2013/01/binding_c_object_for_lua.html 如何绑定 C/C 对象到 Lua 里&#xff1f;通常是创建一个 userdata &#xff0c;存放 C/C 对象指针&#xff0c;然后给 userdata 添加元表&#xff0c;用 index 元方法映射 C/C 中的对象方…

文本字符集转换

http://lqqnotes.blog.51cto.com/3329069/659886 拉取数据 在我opensuse下OK 产品的WIN下面乱码 # enca -L 现在文件的语言 -x 需要转换编码 需要转换编码的文件 查看文件编码jinlinux-gzy1:~> enca -d Downloads/store_sdb_ectools_regions_0211-3.csvDownloads/store_sdb…

php 身份认证服务,PHP的HTTP身份认证

PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效&#xff0c;因此该功能不适用于 CGI 版本。在 Apache 模块的 PHP 脚本中&#xff0c;可以用 header() 函数来向客户端浏览器发送“Authentication Required”信息&#xff0c;使其弹出一个用户名/密码输入窗口。当…

C# WPF MVVM开发框架Caliburn.Micro View / View Model 命名⑨

01—约定在收到Caliburn Micro中有关视图和ViewModel解析的反馈后&#xff0c;我们添加了新功能&#xff0c;以简化类型解析&#xff0c;同时保持驱动它的健壮的基于正则表达式的名称转换机制。为了更好地了解这些新功能以及类型解析通常如何在框架中工作&#xff0c;现在是详细…

rman归档删除

rman&#xff1a; delete [all] input 数据库oracle 11g 全备脚本如下&#xff1a;rman target / <<EOFrun {allocate channel t1 type disk; allocate channel t2 type disk; allocate channel t3 type disk; set limit channel t1 kbytes 4194304;set limit channel t…

史上最气人的数学家:文理双全智商还高,说话只说半句,解题只解半个,调戏人调戏了三百年还不够......

全世界只有3.14 % 的人关注了爆炸吧知识大家上学的时候有没有想过&#xff1a;在数学试卷上调戏阅卷人。想想小天&#xff0c;会都不会写&#xff0c;还调戏阅卷人&#xff1f;想都不敢想。但一个知乎大佬就做了。他居然用费马的原话作答&#xff1a;我已经想到了一个极佳的证明…

php验证手机验证码过期,验证过期时间

~~~//说明目前短信验证码发送成功 需要记录具体的验证码到session。//需要保证验证码有过期时间。关于过期时间 可以记录当前发送验证码的时间以及具体的有效时间$dataarray(code>$code,time>time(),//指定当前的时间limit>3600,//表示具体的过期时间);session(telcod…

数据库(连接)

连接&#xff1a; 为什么需要连接&#xff1f;&#xff1a;因为我们需要的数据在不同的表中 内连接&#xff1a; select 列A from 表A inner join 表B on 条件1条件2 在内连接中可以省去 inner 注&#xff1a;on 必须和join 一起出现 他没有单独存在的意义 外连接&#xff1a…

Hello Blazor:(15)使用bUnit进行单元测试

bUnit介绍bUnit是Blazor组件测试库。其目标是使编写全面、稳定的单位测试变得容易。有了bUnit&#xff0c;你可以&#xff1a;使用C#或Razor语法设置和定义测试下的组件使用语义HTML比较器验证结果与组件以及触发事件处理程序进行交互和检查传递参数、级联值并将服务注入测试组…

*p++,(*p)++,*++p,++*p有什么不同

例如int a[5]{1,2,3,4,5}; int *p a;*p 先取指针p指向的值&#xff08;数组第一个元素1&#xff09;&#xff0c;再将指针p自增1&#xff1b;cout << *p; // 结果为 1cout <<(*p); // 1(*p) 先去指针p指向的值&#xff08;数组第一个元素1&#xff09;&#xff…

掌握这个姿势,女友不再叨叨叨

1 请收下我的膝盖2 正确姿势3 前世五百次的回眸 才换来今生的一次神同步4 论引体向上&#xff0c;你是不如我的5 教科书式的傲娇6 只有我最摇摆7 这是什么原理&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

ubuntu安装matlab2009,Ubuntu中安装Matlab2010a

Ubuntu中安装Matlab2010a一&#xff0e;前言&#xff1a;相信大家对于Matlab应该很熟悉吧&#xff0c;我就不多做介绍了。对于如何在Ubuntu中安装Matlab很多人都不懂&#xff0c;大家都是新手&#xff0c;可以理解。我自己本身就是一个菜鸟&#xff0c;所以决定写这篇文章&…

数据结构笔记--栈的总结及java数组实现简单栈结构

杂谈"栈"结构:   栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于插入和删除操作. 栈结构又叫做LIFO(后进先出)表.归根结底是一个表结构,因此任何能够实现表结构的方…

45岁,一个平凡大叔的异地打工生活

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】&#x1f4e2;作者格言&#xff1a;生活在于…

C之结构体

 C语言中数组允许定义类型的变量,可容纳相同类型的多个数据项,但结构体在C语言编程中,它允许定义不同种类的数据项可供其他用户定义的数据类型。 结构是用来代表一个记录,假设要跟踪图书馆的书籍。可能要跟踪有关每本书以下属性: Title - 标题 Author - 作者 Subject…

用高等数学“铲雪”!这个200多年前的证明太厉害了,有城市用它省了2000多万..........

全世界只有3.14 % 的人关注了爆炸吧知识用高等数学清扫脚下路前几天&#xff0c;北京下了2021年的第一场雪。这让生活在广州的超模君羡慕不已&#xff0c;原本打算春节前去哈尔滨看个冰雕&#xff0c;结果由于各种原因一直都没成行。一个月前被关进小黑屋的设计师妹子刚好来自哈…

matlab排版形式是什么样子,工作型PPT,图文排版的4种常见样式

原标题&#xff1a;工作型PPT&#xff0c;图文排版的4种常见样式图片是PPT中最好用的一种元素&#xff0c;正所谓“一图抵过千言”。但要想让图片真正地发挥价值&#xff0c;图文排版的好坏非常关键。本期将聊聊4种图文排版的处理方法。这些方法也是我们日常工作中的PPT图文排版…

申请格式

格式与范文分析&#xff1a;  &#xff08;1&#xff09;标题  有两种写法&#xff0c;一是直接写“申请书”&#xff0c;另一是在“申请书”前加上内容&#xff0c;如“入党申请书”、“调换工作申请书”等&#xff0c;一般采用第二种。 申请书 &#xff08;2&#xff09;…

基于事件驱动架构构建微服务第15部分:SPA前端

原文链接 https://logcorner.com/building-micro-services-through-event-driven-architecture-part15-spa-front-end/在本教程中&#xff0c;我将展示如何使用angular构建SPA前端来发送命令和请求查询。SPA前端使用commandAPI发送命令&#xff08;创建、更新或删除语音&#x…