EventToCommand

简介: 原文:EventToCommandEventToCommand 在WPF中,并不是所有控件都有Command,例如TextBox,那么当文本改变,我们需要处理一些逻辑,这些逻辑在ViewModel 中,没有Command如何绑定呢?这个时候我们就用到EventToCommand,事件转命令,可以将一些事件例如TextChanged,Checked等 转换成命令的方式。
原文: EventToCommand

EventToCommand

在WPF中,并不是所有控件都有Command,例如TextBox,那么当文本改变,我们需要处理一些逻辑,这些逻辑在ViewModel
中,没有Command如何绑定呢?这个时候我们就用到EventToCommand,事件转命令,可以将一些事件例如TextChanged,Checked等
转换成命令的方式。

不带参数的EventToCommand

AppView.xaml

       <CheckBox>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Checked">
                    <command:EventToCommand Command="{Binding CheckedCommand}"></command:EventToCommand>
                </i:EventTrigger>
                <i:EventTrigger EventName="Unchecked">
                    <command:EventToCommand Command="{Binding UnCheckedCommand}"></command:EventToCommand>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </CheckBox>
        

AppViewModel.cs

        public RelayCommand CheckedCommand
        {
            get;
            set;
        }

        public RelayCommand UnCheckedCommand
        {
            get;
            set;
        }

        public AppViewModel()
        {
            CheckedCommand = new RelayCommand(Checked);

            UnCheckedCommand = new RelayCommand(UnChecked);
        }

        private void Checked()
        {
            MessageBox.Show("Checked");
        }

        private void UnChecked()
        {
            MessageBox.Show("Unchecked");
        }

带参数的EventToCommand

AppView.xaml

        <Button Width="100" Height="30" Margin="0,100,0,0">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <command:EventToCommand Command="{Binding ShowTxtCommand}" PassEventArgsToCommand="True" CommandParameter="Hello"></command:EventToCommand>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
        

AppViewModel.cs

        /// <summary>
        /// 显示消息命令
        /// </summary>
        public RelayCommand<string> ShowTxtCommand
        {
            get;
            set;
        }

        public AppViewModel()
        {
            ShowTxtCommand=new RelayCommand<string>(ShowMsg);
        }

        /// <summary>
        /// 命令具体实现
        /// </summary>
        private void ShowMsg(string msg)
        {
            MessageBox.Show(msg);
        }

转换传递的参数

也许你想知道事件是谁触发的,从而进行一些业务逻辑,那么我们需要从IEventArgsConverter继承

EventArgsConverter.cs

public class EventArgsConverter : IEventArgsConverter
{
    public object Convert(object value, object parameter)
    {
        var args = (RoutedEventArgs)value;
        var btn = parameter as Button;

        return btn.Name;
    }
}

AppView.xaml

   <Button Width="100" Height="30" Margin="0,100,0,0" x:Name="btn">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <command:EventToCommand Command="{Binding ShowNameCommand}" EventArgsConverter="{StaticResource ArgsConverter}" EventArgsConverterParameter="{Binding ElementName=btn}" PassEventArgsToCommand="True"></command:EventToCommand>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
    

AppViewModel.cs

    public RelayCommand<string> ShowNameCommand
    {
        get;
        set;
    }

    public AppViewModel()
    {

        ShowNameCommand = new RelayCommand<string>(ShowName);
    }

    private void ShowName(string name)
    {
        MessageBox.Show(name);
    }
    

看了EventToCommand的源码,并没有什么帮助,我猜测它的实现是这样的,EventToCommand属于附加
属性,它就能获取到它所附加的对象即控件本身,然后它还能Binding命令,比如我们附加的对象是Button
,那么就在它的Click事件时,触发Command命令,同样,有条件判断Command是否能执行时,可以设置
控件的IsEnabled属性。

目录
相关文章
修改vscode侧边栏颜色
修改vscode侧边栏颜色
816 0
|
C#
WPF 左键单击弹出菜单 ContextMenu
原文:WPF 左键单击弹出菜单 ContextMenu WPF中的ContextMenu在XAML中可直接做出来,但是仅限于右键弹出菜单,如果需要添加左键弹出功能,只需要在事件中添加Click事件 XMAL代码如下 ...
2781 0
|
8月前
|
C# 开发者
WPF技术之Cursor
在WPF中,光标(Cursor)用于指示用户在界面上进行交互的位置和行为。WPF提供了多种内置的光标样式,同时还支持自定义光标。
665 0
|
8月前
|
C#
WPF技术之Foreground
在WPF中,Foreground属性用于设置元素的前景颜色。与Background属性类似,Foreground属性可以接受多种类型的值,包括颜色、图像、线性渐变和径向渐变等。
446 0
|
8月前
|
缓存 开发工具 git
你听我说-HandyControl源码编译
你听我说-HandyControl源码编译
192 0
WPF常用UI库和图标库(MahApps、HandyControl、LiveCharts)
WPF有很多开源免费的UI库,本文主要介绍常见的MahApps、HandyControl两个UI库;在开发过程中经常会涉及到图表的开发,本文主要介绍LiveCharts开源图表库。
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
Qt5显示中文乱码的解决方法
Qt5显示中文乱码的解决方法
460 0
Qt5显示中文乱码的解决方法
|
设计模式 弹性计算 人工智能
殷浩详解DDD:领域层设计规范
在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层、基础设施层的设计。但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Entity、ValueObject 还是 DomainService是值得用心思考的,既要避免未来的扩展性差,又要确保不会过度设计导致复杂性。今天我用一个相对轻松易懂的领域做一个案例演示,但在实际业务应用中,无论是交易、营销还是互动,都可以用类似的逻辑来实现。
殷浩详解DDD:领域层设计规范
|
C# 前端开发
WPF 自定义的图表(适用大量数据绘制)
原文:WPF 自定义的图表(适用大量数据绘制) 在WPF中绘制图表比较简单,有很多的第三方控件,但是在绘制大量数据的时候,就显得有些吃力,即便是自己用StreamGeometry画也达不到理想的效果,要达到绘制大量数据而不会顿卡现象,只有一个途径,就是首先在内存中绘制好所有的图形,再一次性加载(或者说绘制)到界面控件Canvas或Grid中。
1147 0