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

posted @ 2016-08-22 10:50  maanshancss  阅读(1661)  评论(1编辑  收藏  举报