聊一下Button事件、命令、行为的触发顺序
1、我们新建一个xaml
<StackPanel Width="200" Margin="20">
<Button Height="30" Content="按钮" Command="{Binding MsgCommand}" x:Name="btn" Margin="10"/>
</StackPanel>
2、分别在后台写入命令和事件
public ICommand MsgCommand { get; set; }
MsgCommand = new DelegateCommand(ExecuteCommand);
private void ExecuteCommand()
{
MessageBox.Show("触发命令");
}
btn.Click += Btn_Click;
private void Btn_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("触发事件");
}
3、运行,发现事件先触发,
由于事件处理程序是直接附加到按钮的 Click 事件上的,所以在点击按钮时会先触发 Btn_Click 事件处理程序,然后才会执行与按钮 Command 属性相关联的命令 MsgCommand
4、我们接着添加行为
public class ButtonBehavior:Behavior<FrameworkElement>
{
public string SelectItem
{
get { return (string)GetValue(SelectItemProperty); }
set { SetValue(SelectItemProperty, value); }
}
public static readonly DependencyProperty SelectItemProperty =
DependencyProperty.Register("SelectItem", typeof(string), typeof(ButtonBehavior), new PropertyMetadata(null,OnSelectedChanged));
private static void OnSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("回调");
}
protected override void OnAttached()
{
MessageBox.Show("OnAttached");
}
protected override void OnChanged()
{
MessageBox.Show("OnChanged");
}
protected override void OnDetaching()
{
MessageBox.Show("OnDetaching");
}
}
5、修改前台代码和后台代码
<StackPanel Width="200" Margin="20">
<i:Interaction.Behaviors>
<local:ButtonBehavior SelectItem="{Binding SelectedValue,Mode=TwoWay}"/>
</i:Interaction.Behaviors>
<Button Height="30" Content="按钮1" Command="{Binding MsgCommand}" x:Name="btn" Margin="10"/>
</StackPanel>
public class MainWindowViewModel : BindableBase
{
private string _selectedValue;
public string SelectedValue
{
get { return _selectedValue; }
set { SetProperty<string>(ref _selectedValue, value); }
}
public MainWindowViewModel()
{
MsgCommand = new DelegateCommand(ExecuteCommand);
}
private void ExecuteCommand()
{
SelectedValue = "123";
MessageBox.Show("触发命令");
}
public ICommand MsgCommand { get; set; }
}
运行后
触发顺序为
1、界面初始化之前,Freezable的Changed事件,2、Behavior的OnAttached事件,
点击按钮后,依次触发,按钮事件、字符串改变,回调,Changed事件,按钮命令,
聊一下Button事件、命令、行为的触发顺序的更多相关文章
- MVVM中间接使用事件(命令)
在使用MVVM模式时, 按照模式的规则是尽量不直接使用事件. 所以对于以前一直使用事件模式的同行来说确实有点头疼. 还好微软给我们提供了几种间接使用事件(命令)的方法, 下面我就来看看这几种方法: I ...
- Visual Studio 生成事件命令
Visual Studio在生成项目工程前后,有时我们需要做一些特殊的操作,比如:拷贝生成的dll到指定目标下面等. 结合VS可以添加预先生成事件和后期生成事件,采用命令或bat批处理. 1.Visu ...
- 10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)
标准参考 在 HTML 4.01 规范中关于 onunload 事件的描述是:当 document 从 window 中移除时,触发 onunload 事件. 关于 HTML 4.01 规范中 onu ...
- Javascript事件触发顺序
html标签是有子和父的,这个时候就出现了事件触发顺序的问题,比如: <!DOCTYPE html> <html> <head> <style> .fi ...
- 关于JS 事件冒泡和onclick,click,on()事件触发顺序
今天在给JQgrid中的标签添加click事件的时候,发现一个问题. JQgrid的table中,点击任何位置,都会勾选点击行的checkbox,而我希望在点击我的标签的时候,不要勾选checkbox ...
- DataGridView的Cell事件的先后触发顺序
最近正在使用“DataGridView”对一个旧的Vs 2003开发的WINDOWS应用程序进行改造. 发现Vs 2003中的"DataGrid"中的一些事件已经在新的控件Data ...
- 针对focus和blur的Dom事件触发顺序
Dom事件触发顺序,拿文本框举例: 它会先触发focus事件,之后才会触发在有交点之后才能触发的一些如 click change 等事件(但如果有mousedown则先执行). 而相对于blur而言 ...
- .Net Install类的Install、Commit等事件触发顺序
.Net Install类的Install.Commit等事件触发顺序 空间 首先是Install其中调用base.Install过程中导致OnBeforeInstallOnAfterInstal ...
- Android实现Button事件的处理
Android实现Button事件的处理 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 首先是最基本的线性布局,给每个控件设立id值,以供代 ...
- 项目属性-->生成事件-->后期生成事件命令行
以开源记牌器https://github.com/Epix37/Hearthstone-Deck-Tracker 为例,Hearthstone Deck Tracker项目中的后期生成事件命令行: i ...
随机推荐
- mac os 解决Error: EMFILE: too many open files错误
壹 ❀ 引 构建项目时终端反复出现Error: EMFILE: too many open files的错误,经排查是因为项目较大,发布过程中已经超过了mac默认的文件监听上限,错误如下: 解决方式也 ...
- Linux进程与线程的基本概念及区别
前言 假设你正在玩一款在线多人游戏,在游戏中,有多个角色需要进行不同的操作,例如攻击.移动.释放技能等等. 接下来,我们用玩游戏的例子,来解释进程和和线程的概念,以及进程和线程的区别. 进程的基本概念 ...
- 【Unity3D】边缘检测特效
1 边缘检测原理 边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色. 本文完整资源见→Unity3D边缘检测特效. 使用过卷积神经网络 ...
- SpringCloud Config配置中心实战
介绍 本文以理论结合实践编写,篇幅较长,各位看官保持耐心:),部分内容引用自网络. 什么是配置中心? 当微服务过多的时候,每个微服务的配置很难集中管理.SpringCloud Config通过git代 ...
- BUG管理系统(Mantis)迁移实战
Mantis迁移实战 名词解释 Mantis: 开源的BUG管理平台Mantis,也做MantisBT. 同档次产品有EasyBUG,QC,BugFree,Bugzila. Xa ...
- Vue+ElementUI实现用户管理前后分离实战一:前端篇
项目介绍 前几天有老铁问我能不能写一个Vue+ElementUI+SpringBoot后端的前后分离项目,最近有点忙,但今天他还是来了!希望对大家能有点帮助,大家还想要点啥也可以加我QQ或给我留言 : ...
- 解决Linux平台Selenium截图中文乱码问题
通常情况下,像CentOS这样的Linux发行版默认是缺少中文字体的,所以在执行Selenium截图时,如果目标网页中有中文,则截图后中文将会显示为方块一样的乱码. 解决办法:手动安装中文字体即可. ...
- python selenium list index out of range
常见错误原因 常见错误原因 其他错误原因 场景 使用selenium循环打开并跳转到新的网页,然后关闭新的窗口,然后回到原来窗口,这时候获取list中的值,报错: list index out of ...
- 什么是Redis持久化?
Redis持久化指的是将内存中的数据同步到硬盘文件,并在redis重新启动的时候将数据备份到硬盘上,从而保证数据的安全性.通过持久化, Redis可以在系统关闭时将数据保存到硬盘上,避免了数据丢失的风 ...
- 字典嵌套列表 与 列表嵌套字典 导出为csv 的方法
字典嵌套列表 导出csv {'rank': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '1 ...