Caliburn.Micro学习笔记(二)----Actions
上一篇已经简单说了一下引导类和简单的控件绑定
我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧
今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持
我们还是从做例子开始
demo的源码下载在文章的最后
例子1.无参数方法调用
点击button把textBox输入的文本弹出来
如果textbox里没有文本button不可点,看一下效果图
看一下前台代码
<StackPanel>
<TextBox x:Name="Mytxt" />
<Button Height="30" Margin="0,3" Content="Click Me">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="MyClick">
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</StackPanel>
是通过行为把click事件传递给Myclick方法
也可以这么写
<Button Height="30" Margin="0,3" Content="Click Me2" cal:Message.Attach="[Event Click]=[Action MyClick()]"/>
因为没有参数Action MyClick() 的括号可以不用写直接写成Action MyClick也可以 如果你用其它的控件想把事件和viewmodel里的方法关联起来这个是一样的把Click换成其它的事件就ok
viewModel的代码
[Export(typeof(IShell))]
class AppViewModel: PropertyChangedBase,IShell
{
private string _Mytxt;
public string Mytxt
{
get
{
return _Mytxt;
}
set
{
_Mytxt = value;
NotifyOfPropertyChange(() => Mytxt);
NotifyOfPropertyChange(() => CanMyClick);
}
}
public bool CanMyClick
{
get
{ return !string.IsNullOrEmpty(_Mytxt); }
}
public void MyClick()
{
MessageBox.Show(_Mytxt);
}
}
你会发现有一个MyClick方法和一个CanMyClick的布尔属性,这就是控制button的IsEnable属性这是Caliburn的一个规则
2.有参数的方法和控件元素绑定
有参数的方法关联其实是一样的
我们把上边的例子做一下修改
先看一下效果图 三个button调用 的同一个方法
看一下前台页面如何调用同一个方法
<Window x:Class="CalibrunMicAction.AppView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cal="http://www.caliburnproject.org"
Title="AppView" Height="300" Width="300">
<StackPanel>
<TextBox x:Name="Mytxt" />
<Button Height="30" Margin="0,3" Content="Click Me">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="MyClick">
<cal:Parameter Value="{Binding ElementName=Mytxt,Path=Text}"/>
<cal:Parameter Value="aaabbbccc"/>
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button Height="30" Margin="0,3" Content="Click Me2" cal:Message.Attach="[Event Click]=[Action MyClick($source,'aaaa')]"/>
<Button Height="30" Margin="0,3" Content="Click Me3" cal:Message.Attach="[Event Click]=[Action MyClick($source,Mytxt.Text)]"/>
</StackPanel>
</Window>
我们把MyClick方法改成两个参数的方法一个是object类型一个是string类型
注意:第一个button和第三个button都是把textbox的text元素当做参数传给MyClick方法只是两种不同的写法
$source等会我再详细说它是绑定的控件本身在这个demo里就是button从弹出来的提示你也可以看出来。
再看一下ViewModel是怎么操作的
[Export(typeof(IShell))]
class AppViewModel: PropertyChangedBase,IShell
{
private string _Mytxt;
public string Mytxt
{
get
{
return _Mytxt;
}
set
{
_Mytxt = value;
NotifyOfPropertyChange(() => Mytxt);
NotifyOfPropertyChange(() => CanMyClick);
}
}
public bool CanMyClick
{
get
{ return !string.IsNullOrEmpty(_Mytxt); }
}
public void MyClick(object str,string str2)
{
MessageBox.Show(str.ToString()+" "+str2);
}
}
我们说一下上面看到的$source Caliburn.Micro提供了一些定义好的参数(不区分大小写)供我们在传递时用 ,当然我们也可以自定义我们自己的参数
$eventArgs — — 将触发器的 EventArgs 或输入的参数传递到您的行动。
$dataContext — — ActionMessage 附加到的元素的 DataContext
$source — — 触发 ActionMessage 的控件
$view -绑定到 ViewModel 视图 (通常是用户控件或窗口)。
$executionContext -包含上述所有信息和更多的行动的执行上下文。
$this -行动所附加到的实际用户界面元素
这个$this感觉和$dataContext没什么区别
如果想自定义参数可以写到用这个方法MessageBinder.SpecialValues进行扩展
我们来写一个自定义的参数
要在 Mybootstrapper的config里写
怎么用呢,我们在原来的例子上再加上一个button
<Button Height="30" Margin="0,3" Content="Click Me4" cal:Message.Attach="[Event Click]=[Action MyClick($mysender,Mytxt.Text)]"/>
看一下它弹出来什么
细心的人会发现它和$source弹出来的是一样的。
这是Caliburn.Micro Action的源码,默认的是Click和控件的LeftMouseButtonDown事件,有时间你可以详细读一下它的源码
Demo源码:CalibrunMicAction.rar
- 颠覆者的游戏:程序语言
- CTF| SQL注入之login界面
- 懒惰的力量
- 让AI自动修复程序中的bug:微软亚洲研究院新研究 | 附论文
- OpenDaylight与Mininet应用实战之OpenFlow1.0协议分析二
- Javascript: 世纪机器语言?
- OpenDaylight与Mininet应用实战之基本环境搭建一
- 永恒不变的魅力
- MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
- OpenDaylight与Mininet应用实战之流表操作三
- 天啊,这个围笑代表什么?麻省理工的AI比你更懂 | 论文+Demo
- elixir:灵丹妙药?or 徒有其名?
- OpenDaylight与Mininet应用实战之三层转发机制四
- 程序员效率指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ASP.NET Core 使用 Google 验证码(reCAPTCHA v3)代替传统验证码
- Centos7 安装 Tomcat8 伪集群 的正确姿势 并设置开机自启 实践笔记
- 问题合集,持续更新
- ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi
- 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
- OpenGL ES 变量、结构体、语句、函数、精度
- OpenGL ES for Android 绘制矩形和正方形
- OpenGL ES for Android 绘制立方体
- 服务化最佳实践
- OpenGL ES for Android 深度测试
- OpenGL ES for Android 绘制旋转的地球
- [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
- Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported
- OpenGL ES for Android 播放视频
- Centos 7 在线安装 离线安装 最新 Docker-compose 的正确姿势 实践笔记