WPF中,我们使用MVVM,在ViewModel中定义Command和其业务逻辑,界面绑定Command。
那么是不是所有的事件都可以定义Command呢,然后将业务全部放在ViewModel中呢?
界面CommandBindings
如果只是交互的处理,可以直接定义RoutedCommand即可
1. 添加Command
1 <RoutedCommand x:Key="SelectAllCommand"/>
2. 添加命令委托处理
1 <UserControl.CommandBindings> 2 <CommandBinding Command="{StaticResource SelectAllCommand}" Executed="SelectAllExecuted"/> 3 UserControl.CommandBindings>
3. 绑定Command
1 <CheckBox Name="AllSelectCheckBox" Command="{StaticResource SelectAllCommand}" />
InvokeCommandAction
控件不只有Button,还有其它很多TextBox/ListBox等控件甚至自定义控件的KeyDown/MouseUp/LostFocus等事件以及自定义的事件。
我们都知道Buttton有Command属性(对应Click事件),直接绑定相应的Command就可以了,那么除Button.Click事件之外的事件怎么绑定?
CommandAction是Trigger与Command的中间转换器
通过InvokeCommandAction 的使用,WPF任意事件都可以绑定Command,将业务逻辑放在ViewModel中。如:
自定义Command,请参考https://www.cnblogs.com/kybs0/p/7523654.html
案例:下载 System.Windows.Interactivity.dll,引用后就可以直接使用如下的Interaction了。
1 <Button x:Name="SearchingButton"> 2 <i:Interaction.Triggers> 3 <i:EventTrigger EventName="MouseDown"> 4 <i:InvokeCommandAction Command="{Binding SearchCommand}" 5 CommandParameter="{Binding ElementName=SearchingTextBox,Path=Text}"/> 6 i:EventTrigger> 7 i:Interaction.Triggers> 8 Button>
快捷键绑定
通过Key值,绑定ViewModel中相应命令
1 <UserControl.InputBindings> 2 <KeyBinding Key="Delete" Command="{Binding MenuDeleteCommand}" /> 3 UserControl.InputBindings>