我有一个应该捕获KeyDown / KeyUp事件的表单。
此代码因NRE而失败,因为它在我当前视图中查找KeyDown控件:
this.BindCommand(ViewModel, vm => vm.KeyDown, "KeyDown");
我所做的是创建了包装类,它具有作为属性的形式,所以我可以使用这个重载:
this.BindCommand(ViewModel, vm => vm.KeyDown, v => v.Form, "KeyDown");
虽然它有效但对我来说似乎是个黑客。是否有适当的方法来绑定本地事件?
答案 0 :(得分:6)
如果您正在使用BindCommand,这是正确的方法。如果你想摆脱字符串而你正在使用ReactiveUI.Events,你也可以这样做:
this.Form.Events().KeyDown
.InvokeCommand(this, x => x.ViewModel.KeyDown);
另外,“KeyDown”不是一个非常MVVM的命令。我写了你的密钥=> View层的命令映射,如下所示(通过TextArea编码,忽略语法错误):
this.Form.Events().KeyDown
.Where(x => x.Key == Key.C && (x.Modifier & Modifier.Ctrl))
.InvokeCommand(this, x => x.ViewModel.CopyText;
答案 1 :(得分:1)
我意识到我在这个特定的派对上已经很晚了,但是因为我一直在做类似的事情,所以这是我采取的方法,基于保罗的建议:
var keyDownSub= Observable.FromEventPattern<KeyEventHandler, KeyEventArgs>(
ev => txtbxCommandLine.KeyDown += ev,
ev => txtbxCommandLine.KeyDown -= ev
).Select(x => x.EventArgs)
.Where(x =>
x.KeyCode.ToString().ToUpper().Equals("RETURN")
&& (_returnKeyPressed || x.Alt || x.Control))
.InvokeCommand(_mainViewModel.ProcessCommandLine);
这似乎在WinForms中完全正常,如果它比在WPF中更加冗长。