WPF中使用System.Windows.Interactivity实现事件绑定的替代方法
一、问题描述
对于 Button
等控件,在 MVVM
中我们能通过 Command
绑定解决 Click
事件。具体如下所示:
<Button Margin="10" Height="50" Content="Clear" Command="{Binding Path=Clear}"></Button>
对于TextChanged
、MouseMove
等事件可以借助System.Windows.Interactivity
文件后也可实现事件的绑定,具体描述见WPF 之事件绑定。
那如何实现不使用System.Windows.Interactivity
文件也实现此类事件的绑定呢?
答案是借助附加属性来完成。
二、借助附加属性完成事件绑定
例如以TextChanged
事件为例,我们首先申明一个附加属性TextBoxChangedCommand
如下所示:
public class AttachProperty
{
public static readonly DependencyProperty TextBoxChangedCommandProperty = DependencyProperty.RegisterAttached("TextBoxChangedCommand", typeof(ICommand), typeof(AttachProperty), new PropertyMetadata(OnTextBoxChangedCommandPropertyChangedCallback));
[AttachedPropertyBrowsableForType(typeof(TextBox))]
public static ICommand GetTextBoxChangedCommand(DependencyObject obj)
{
return (ICommand)obj.GetValue(TextBoxChangedCommandProperty);
}
public static void SetTextBoxChangedCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(TextBoxChangedCommandProperty, value);
}
private static void OnTextBoxChangedCommandPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is TextBox textBox)
{
textBox.TextChanged += (sender, args) =>
{
var command = (ICommand)textBox.GetValue(TextBoxChangedCommandProperty);
// 此处的参数发送,可以根据情况发送,例如需要文本内容,则返回textBox.Text。
command?.Execute(textBox.Text);
};
}
}
}
然后在在界面对应的ViewModel
里面声明一个ICommand
,具体如下:
public class MainWindowVM
{
public ICommand TextCommand { get; set; }
private void ExecuteTextCommand(object args)
{
MessageBox.Show($"数值变为:{args}");
}
public MainWindowVM()
{
TextCommand = new RelayCommand(ExecuteTextCommand);
}
}
在对应的界面上,将ViewModel
里面的TextCommand
命令属性绑定到附加属性上TextBoxChangedCommand
,具体如下所示:
<TextBox Height="100" Margin="20"
local:AttachProperty.TextBoxChangedCommand="{Binding TextCommand, Mode=OneTime}"></TextBox>
如此即可实现当TextBox
数值发生变化的时候,触发TextCommand
命令,并能也将对应参数也发生至该命令!
WPF中使用System.Windows.Interactivity实现事件绑定的替代方法的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM设计模式和在WPF中的实现(四) 事件绑定
系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中的实现(三)命令绑定 MVVM模式解析和在WPF中的 ...
- 【WPF/WAF】使用System.Windows.Interactivity交互事件
下载System.Windows.Interactivity.dll文件,并引入项目中(在VS项目的引用列表中可以看到).可在Nuget搜索System.Windows.Interactivity下载 ...
- 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题
原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些
WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...
- MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件
原文 MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...
- VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法
原文:VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/ar ...
- WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...
随机推荐
- vision transformer
VIT 总览 Step1 Step2
- [算法学习] 换根dp
换根dp 一般来说,我们做题的树都是默认 \(1\) 为根的.但是有些题目需要计算以每个节点为根时的内容. 朴素的暴力:以每个点 \(u\) 作为 \(root\) 暴力dfs下去,复杂度\(O(n^ ...
- mysql 超时配置
日志报错: No operations allowed after connection closed.; nested exception is com.mysql.jdbc.exceptions. ...
- React设置proxy后依旧报CROS错误
1.判断表单数据是否为后端接收的类型 POST GET2.axios自动转换问题 手动添加标头这份表单数据包括了files (二进制数据)而标头显示是JSON格式 不符 所以报CROS 更多文章请移步 ...
- CabloyJS - GitHub Readme
简体中文 | English CabloyJS CabloyJS是一款顶级NodeJS全栈业务开发框架, 基于KoaJS + EggJS + VueJS + Framework7 文档 官网 & ...
- 送分题,ArrayList 的扩容机制了解吗?
1. ArrayList 了解过吗?它是啥?有啥用? 众所周知,Java 集合框架拥有两大接口 Collection 和 Map,其中,Collection 麾下三生子 List.Set 和 Queu ...
- Jmter入门教程
Jmter入门教程 本文已同步到公众号,欢迎关注: 1. 简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免 ...
- tomcat JDK环境变量配置及tomcat多项目的配置
1.解压JDK tar xzf jdk-8u171-linux-i586.tar.gz -C /usr/local -->mv /usr/local/jdk1.8.0_171 /usr/loca ...
- umask默认权限及特殊权限
1. linux系统中,创建一个新的文件或者目录的时候,新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关. 用户创建一个文件,文件的默认权限为 -rw-rw-rw-(6 ...
- 20行python代码,轻松获取各路小说,非常简单
哔哔两句 作为现代青年,我相信应该没几个没看过小说的吧,嘿嘿~ 一般来说咱们书荒的时候怎么办?自然是去起某点排行榜先找到小说名字,然后再找度娘一搜,哎 ,笔趣阁就出来答案了,美滋滋~但是那多麻烦,咱们 ...