如何将命令绑定到本地事件
本文关键字:事件 绑定 命令 | 更新日期: 2023-09-27 17:50:58
我有一个应该捕获KeyDown/KeyUp事件的表单。
这段代码用NRE失败了,因为它在我的当前视图上寻找KeyDown控制:
this.BindCommand(ViewModel, vm => vm.KeyDown, "KeyDown");
我所做的是创建包装类的形式作为一个属性,所以我可以使用这个重载:
this.BindCommand(ViewModel, vm => vm.KeyDown, v => v.Form, "KeyDown");
虽然它可以工作,但对我来说它似乎是一个hack。是否有合适的方式绑定到本地事件?
如果你正在使用BindCommand,这是正确的方法。如果你想摆脱字符串而你在使用ReactiveUI。事件,您还可以这样做:
this.Form.Events().KeyDown
.InvokeCommand(this, x => x.ViewModel.KeyDown);
作为题外话,"KeyDown"不是一个非常MVVM'y命令。我会在视图层写你的键=>命令映射,像这样(通过TextArea编码,忽略语法错误):
this.Form.Events().KeyDown
.Where(x => x.Key == Key.C && (x.Modifier & Modifier.Ctrl))
.InvokeCommand(this, x => x.ViewModel.CopyText;
我意识到我来晚了,但因为我一直在做类似的事情,所以根据Paul的建议,我采取了以下方法:
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中更冗长的话。