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>