如何将命令绑定到本地事件?

ion*_*noy 3 c# winforms reactiveui

我有一个应该捕获KeyDown/KeyUp事件的表单.

此代码因NRE而失败,因为它在我当前视图中查找KeyDown控件:

this.BindCommand(ViewModel, vm => vm.KeyDown, "KeyDown");
Run Code Online (Sandbox Code Playgroud)

我所做的是创建了包装类,它具有作为属性的形式,所以我可以使用这个重载:

this.BindCommand(ViewModel, vm => vm.KeyDown, v => v.Form, "KeyDown");
Run Code Online (Sandbox Code Playgroud)

虽然它有效但对我来说似乎是一个黑客.有没有正确的方法来绑定本地事件?

Ana*_*tts 6

如果您正在使用BindCommand,这是正确的方法.如果你想摆脱字符串并且你正在使用ReactiveUI.Events,你也可以这样做:

this.Form.Events().KeyDown
    .InvokeCommand(this, x => x.ViewModel.KeyDown);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,"KeyDown"不是一个非常MVVM的命令.我在View层编写你的key =>命令映射,就像这样(通过TextArea编码,忽略语法错误):

this.Form.Events().KeyDown
    .Where(x => x.Key == Key.C && (x.Modifier & Modifier.Ctrl))
    .InvokeCommand(this, x => x.ViewModel.CopyText;
Run Code Online (Sandbox Code Playgroud)