以前都是控件绑定Command,MvvmLight进行绑定很简单,使用Blend几步操作就好,但是这短时间的项目需要绑定键盘事件。结果发现MvvmLight绑定按键很麻烦。看到有篇文章说Silverlight可以使用KeyTrigger进行Command绑定,但是实际测试的时候在WPF中KeyTrigger中定义InvokeCommandAction,其中CommandName属性不支持绑定,而且不支持Command属性。项目已经基本完工,临时改架构肯定不可能,OK,我们只能借用CodeBehind来调用ViewModel的Command。当然这样子是比较丑陋的写法。当然可以重写EventToCommand来进行按键的Command绑定。这样子比较优雅的写法,这是后话。
OK,我们先看用CodeBehind的Shit代码……
在ViewModel中有这样的Command代码:
1: public ICommand StartLotteryCommand { get; private set; } //定义Command2:
3: public MainViewModel()4: {
5:
6: StartLotteryCommand = new RelayCommand(7: ()=>{
8: //加入自己的代码逻辑9: }
10: );
11: }
我们在界面的CodeBehind代码中加入按键事件。首先给Window添加
KeyUp事件。在Xaml中添加 KeyUp="Window_KeyUp" 即可。
然后在*.Xaml.cs中的事件中进行Command调用。
1: private void Window_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)2: {
3: switch (e.Key)4: {
5: case Key.S:6: ((MainViewModel)this.DataContext).StartLotteryCommand.Execute(null);7: break;8: default:9: break;10: }
11: }
我们知道,Command都有两个事件,CanExecute和Execute,执行Execute事件即调用该Command。OK,现在键盘事件已经和Command绑定。
当然,如果想获得如同控件绑定Command那样优雅的写法,就需要重写EventToCommand,以后再详述。