wpf之Interaction.Triggers

前言

在wpf中 Interaction.Triggers是对命令的补充,命令能应用的场合有限,比如Button的单击事件,但是像window窗体的Loaded事件,TextBox的TextChanged就无法使用命令。Interaction.Triggers的结构如下:

csharp 复制代码
<控件>
    <i:Interaction.Triggers>
        <触发器类型>
            <动作类型 属性="值"/>
        </触发器类型>
    </i:Interaction.Triggers>
</控件>

1、引用dll

在NuGet包管理器中选择Microsoft.Xaml.Behaviors.Wpf这个包安装

2、引用命名空间

在xaml代码中加上如下代码

csharp 复制代码
 xmlns:Event="http://schemas.microsoft.com/xaml/behaviors"

3、window的Loaded事件

下面的代码中EventName指定了需要绑定的事件的名称,这里是"Loaded"事件。在InvokeCommandAction的Command属性中绑定事件CommandWindowLoaded,这里的CommandWindowLoaded在ViewModel类中定义和实例化。

csharp 复制代码
<Window x:Class="wpf之Interaction.Triggers.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf之Interaction.Triggers"
        xmlns:Event="http://schemas.microsoft.com/xaml/behaviors"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Event:Interaction.Triggers>
        <Event:EventTrigger EventName="Loaded">
            <Event:InvokeCommandAction Command="{Binding CommandWindowLoaded}"/>
        </Event:EventTrigger>
    </Event:Interaction.Triggers>
    <Grid>
       
    </Grid>
</Window>

自定义命令DelegateCommand

csharp 复制代码
public class DelegateCommand : ICommand
    {
        private readonly Action<object> _execute;
        private readonly Func<object, bool> _canExecute;

        public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _execute = execute ?? throw new ArgumentNullException(nameof(execute));
            _canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            if (_canExecute != null)
            {
                return _canExecute(parameter);
            }
            else
            {
                return true;
            }
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }


        public event EventHandler CanExecuteChanged
        {
            add => CommandManager.RequerySuggested += value;
            remove => CommandManager.RequerySuggested -= value;
        }
    }

定义ViewMode的基类ViewModelBase

csharp 复制代码
 public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propname));
            }
        }

    }

定义ViewMode并且继承ViewModelBase,在ViewMode中实例化一个命令,

csharp 复制代码
 public class ViewModel : ViewModelBase
    {

        public ICommand CommandWindowLoaded { get; set; }
        public ViewModel()
        {
            CommandWindowLoaded = new DelegateCommand(WindowLoaded);
        }

        public void WindowLoaded(object param)
        {
            Console.WriteLine("窗体加载");
        }
    }

4、TextBox的TextChanged事件

当你改变TextBox内容的时候,不停的就会触发TextChangedCommand命令执行。

下面的代码同样是通过EventName指定需要绑定的事件类型,通过Command属性来绑定ViewModel中具体的事件,同时还可以传递参数。

csharp 复制代码
<Window x:Class="wpf之Interaction.Triggers.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf之Interaction.Triggers"
        xmlns:Event="http://schemas.microsoft.com/xaml/behaviors"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Event:Interaction.Triggers>
        <Event:EventTrigger EventName="Loaded">
            <Event:InvokeCommandAction Command="{Binding CommandWindowLoaded}"/>
        </Event:EventTrigger>
    </Event:Interaction.Triggers>
    <Grid>
        <StackPanel >
            <TextBox x:Name="tbx_test" Height="20" Width=" 40">
                <Event:Interaction.Triggers>
                    <Event:EventTrigger EventName="TextChanged">
                        <Event:InvokeCommandAction Command="{Binding TextChangedCommand}" CommandParameter="{Binding Path=Text,ElementName=tbx_test}"/>
                    </Event:EventTrigger>
                </Event:Interaction.Triggers>
            </TextBox >
        </StackPanel >
    </Grid>
</Window>
csharp 复制代码
 public class ViewModel : ViewModelBase
    {

        public ICommand CommandWindowLoaded { get; set; }
        public ICommand TextChangedCommand { get; set; }
        public ViewModel()
        {
            CommandWindowLoaded = new DelegateCommand(WindowLoaded);
            TextChangedCommand= new DelegateCommand(TextChange);
        }

        public void WindowLoaded(object param)
        {
            Console.WriteLine("窗体加载");
        }


        public void TextChange(object param)
        {
            Console.WriteLine($"文本修改{param}");
        }
    }

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》

2、《C#与PLC通信从入门到精通 》

3、《C# Modbus通信从入门到精通》

4、《C#Socket通信从入门到精通 》

5、《C# MES通信从入门到精通》

6、《winform控件从入门到精通》

7、《C#操作MySql数据库从入门到精通》

相关推荐
八苦9 小时前
如何用c# 做 mcp/ChatGPT app
c#·mcp
人工智能AI技术11 小时前
DeskClaw Windows上线|C#开发AI桌面助手,轻量内核源码解析
人工智能·c#
似水明俊德11 小时前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net
程序员老乔14 小时前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(二):Valhalla落地,值类型如何让电商DTO内存占用暴跌
java·spring boot·c#
祝大家百事可乐15 小时前
嵌入式——02 数据结构
c++·c#·硬件工程
我是唐青枫15 小时前
深入理解 C#.NET TaskScheduler:为什么大量使用 Work-Stealing
c#·.net
唯情于酒17 小时前
net core web api 使用log4net
c#·.net core
SunnyDays101118 小时前
C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)
开发语言·c#
人工智能AI技术18 小时前
Qwen3.5-Plus登顶|C#集成通义千问,高并发服务实战优化
人工智能·c#
SunnyDays101119 小时前
如何使用 C# 在 Word 文档中插入超链接 (含文本与图片链接)
开发语言·c#