EventToCommand

EventToCommand

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

不带参数的EventToCommand

AppView.xaml


<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>

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

AppViewModel.cs

///


/// 显示消息命令
///

public RelayCommand ShowTxtCommand
{
get;
set;
}

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

///


/// 命令具体实现
///

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

AppViewModel.cs

public RelayCommand ShowNameCommand
{
get;
set;
}

public AppViewModel()
{

ShowNameCommand = new RelayCommand(ShowName);
}

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

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

posted @ 2015-08-22 13:20  UncleNull  阅读(4701)  评论(1)    收藏  举报