zoukankan      html  css  js  c++  java
  • 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属性。

  • 相关阅读:
    November 13th 2016 Week 47th Sunday The 1st Day
    November 12th 2016 Week 46th Saturday
    November 11th 2016 Week 46th Friday
    November 10th 2016 Week 46th Thursday
    November 9th 2016 Week 46th Wednesday
    November 8th 2016 Week 46th Tuesday
    windows 7文件共享方法
    Win7无线网络共享设置方法
    常量指针和指针常量
    如何查找局域网的外网ip
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/4750059.html
Copyright © 2011-2022 走看看