zoukankan      html  css  js  c++  java
  • MVVM 事件转命令1

    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属性。

  • 相关阅读:
    mui---mui.preload预加载后的几种显示方法
    mui---验证页面是否加载或显示
    JS---使用localStorage传递参数
    mui---通过mui.openWindow传递参数
    mui---window.location.href通过url传递参数
    mui---mui.fire触发自定义事件传事件对象中的参数
    mui---webview对象调用evalJS来传递参数
    window----结束占用某端口的进程
    爬虫程序
    winform 属性
  • 原文地址:https://www.cnblogs.com/maanshancss/p/5794759.html
Copyright © 2011-2022 走看看