任意事件绑定到Command的集中方法
1.InvokCommandAction
在NuGet中添加 System.Windows.Interactivity.WPF
在Xaml中添加引用
xmlns:i="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:ii="http://schemas.microsoft.com/expression/2010/interactivity"
使用InvokCommandAction,能传递控件本身,但没有EventArgs e参数
EventName是想触发的事件名
InvokCommandAction中的 Command绑定的命令,需要写在ViewModel或者Model中,必须是一个继承自ICommand接口的类的实例
<StackPanel>
<ComboBox Height="50" >
<i:Interaction.Triggers>
<!--无法传递参数,适用于不使用参数的事件,InvokeCommandAction在interactivity中-->
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding mainModel.BtnAddCommand }"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<ComboBoxItem Content="1"/>
<ComboBoxItem Content="2"/>
<ComboBoxItem Content="3"/>
<ComboBoxItem Content="4"/>
</ComboBox>
<StaclPanel>
2.使用CallMethodAction,可以传递参数
<ComboBox Height="50" >
<i:Interaction.Triggers>
<!-- CallMethodAction在interactions中 -->
<i:EventTrigger EventName="SelectionChanged">
<ii:CallMethodAction TargetObject="{Binding}"
MethodName="ComboBox_SelectionChanged"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<ComboBoxItem Content="1"/>
<ComboBoxItem Content="2"/>
<ComboBoxItem Content="3"/>
<ComboBoxItem Content="4"/>
</ComboBox>
ViewModel中:
把原来写在MainWindow.cs中的事件挪到vm中,需要把事件的访问权限改成public,默认是private的
InvokeCommandAtion和CallMethodAction的区别?
InvokeCommandAtion:单纯的是用Command进行触发,并且VM中需要声明ICommand方法
CallMethodAction,其实是反射的方法,targetObject的binding是直接绑定DataContext,程序在执行时从DataContext中寻找MethodName的方法体,不需要写命令
在使用 System.Windows.Interactivity.WPF时,会提示让使用Microsoft.Xaml.Behaviors.Wpf
在xaml中删除System.Windows.Interactivity.WPF的引用
![](https://i-blog.csdnimg.cn/blog_migrate/de626ccfe33a4e89cc14af7f639c9950.png)
添加对Microsoft.Xaml.Behaviors.Wpf的引用
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
InvokeCommandAtion和CallMethodAction都在这一个命名空间中
3.EventToCommand
上面2中情况是在不使用mvvmlight情况下,
在mvvmlight下,可以使用EventToCommand,在命名空间下:
xmlns:cmd="http://www.galasoft.ch/mvvmlight"
还需要使用
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
不能使用
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xaml中:
<Button Name="b2" Content="带参数按钮">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding testcmd2}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
PassE ventArgstoCommand="true"决定是否传递参数
VewModel或者Model中定义一个命令
public class MYViewModel
{
public ICommand testcmd { get; set; }
public ICommand testcmd2 { get; set; }
public MYViewModel()
{
testcmd = new RelayCommand(new Action(ButtonClick)) ;
testcmd2 =new RelayCommand<EventArgs>(new Action<EventArgs>(ButtonClick2)) ;
}
private void ButtonClick2(EventArgs obj)
{
}
private void ButtonClick()
{
}
}
testcmd不带参数。testcmd2带参数
obj就是EventArgs