一、问题描述

对于 Button 等控件,在 MVVM 中我们能通过 Command 绑定解决 Click 事件。具体如下所示:

    <Button Margin="10" Height="50" Content="Clear" Command="{Binding Path=Clear}"></Button>

对于TextChangedMouseMove等事件可以借助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实现事件绑定的替代方法的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. MVVM设计模式和在WPF中的实现(四) 事件绑定

    系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中的实现(三)命令绑定 MVVM模式解析和在WPF中的 ...

  3. 【WPF/WAF】使用System.Windows.Interactivity交互事件

    下载System.Windows.Interactivity.dll文件,并引入项目中(在VS项目的引用列表中可以看到).可在Nuget搜索System.Windows.Interactivity下载 ...

  4. 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题

    原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...

  5. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  6. 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些

    WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...

  7. MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件

    原文  MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...

  8. VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法

    原文:VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/ar ...

  9. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

随机推荐

  1. Navicat破解激活流程

    ​​ ​ Navicat Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL.MariaDB.MongoDB.SQL Server.Oracle.Postg ...

  2. autohotkey(AHK)实现箭头映射

    起因 在主力本上使用了AHK实现alt ijkl的箭头映射,在另一个本子上怎么都不习惯,于是网上找教程,找了半天... 因为大家习惯了快捷键都不一样,为了避免以后浪费时间,因此开此文记录. 操作 ht ...

  3. iview 酸爽debug: subMenu默认选中无效的解决方法

    一. 在iview中写一个submenu <Col span="3" type="flex" v-if="showCids"> ...

  4. 跨域问题和使用 cookie 的限制

    前言 在我的文章 使用 cookie 的身份验证和授权 的最后,讲到了跨域问题,这篇文章就简单介绍跨域的相关知识,并说明在 net core 中怎么设置跨域. 使用的版本为 net6,并使用 Mini ...

  5. hibernate-validator的基本使用

    validator是用来校验参数使用! 一般来说校验参数的工作可以放在前端去执行,但是假如有人不经过前端直接调用后端的接口呢?很可能就出现非法数据而导致一些问题,所有服务端也要做数据的校验. 前端校验 ...

  6. 覆盖率检查工具:JaCoCo 食用指南

    一:概述 众所周知,软件的代码覆盖率是衡量软件质量的重要指标, 我们今天简单介绍 JaCoCo 的实际使用示例,它是目前在大多数 Java 项目中应用最广泛的覆盖率检测框架 更多资料参考:JaCoCo ...

  7. 技术分享 | Appium 用例录制

    原文链接 下载及安装 下载地址: https://github.com/appium/appium-desktop/releases 下载对应系统的 Appium 版本,安装完成之后,点击 " ...

  8. 二、shell 脚本条件测试

    目录 一.条件测试 test 格式 文件测试 文件测试常见选项 整数值比较 字符串比较 浮点数的运算 逻辑测试 二.if语句 1单分支 2双分支结构 3多分支结构 三元运算符 三.case 一.条件测 ...

  9. ABAP CDS - DEFINE VIEW, view_annot

    Syntax ... @annotation ... Effect Specifies Annotation annotation in the definition of a CDS view of ...

  10. Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程

    上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...