聊一下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 ...
随机推荐
- NC53079 Forsaken喜欢数论
题目链接 题目 题目描述 Forsaken有一个有趣的数论函数.对于任意一个数 \(x\) , \(f(x)\) 会返回 \(x\) 的最小质因子.如果这个数没有最小质因子,那么就返回0. 现 ...
- NAND flash 扫盲博客
从SSD角度学习NAND Flash(一)_小小单片机的博客-CSDN博客 从SSD角度学习NAND Flash(二)_ssd和nand 的交互_小小单片机的博客-CSDN博客 从SSD角度学习NAN ...
- ARP(Address Resolution Protocol) Packet
Address Resolution Protocol The Address Resolution Protocol (ARP) is a communication protocol used f ...
- iptables的mangle表
mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由. 使用策略路由 对应的场景, 都是有多个网口, 常见的使用步骤 1. 创建路由表 ...
- 【Unity3D】场景切换、全屏_恢复切换、退出游戏、截屏
1 前言 1)场景切换 场景切换可以使用 SceneManager 的 LoadScene 和 LoadSceneAsync 方法,如下: public static void LoadSce ...
- Vue实现简单计算器功能
知识点: v-model双向绑定 v-on事件绑定 实现效果 源码 <!DOCTYPE html> <html lang="en"> <head> ...
- 将字符串"a,b,c"以逗号分隔转换为数组并打印
主要利用了String的split方法. package com.dylan.test; /** * @author xusucheng * @create 2017-12-22 **/ public ...
- 【Android 逆向】【攻防世界】黑客精神
1. apk 安装到手机,提示输入注册码 2. jadx打开apk MainActivity.java @Override // android.app.Activity public void on ...
- flutter打包android的一些配置修改(解决白屏,视频闪退)
1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...
- ECharts渐变温度直方图
ECharts渐变直方图,根据具体的值调整色带,使所有颜色看起来协调一致. 直接在series数组中的对象中添加如下代码即可: itemStyle: { color: function (params ...