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

时间:2014-03-18 16:28:46

标签: c# winforms reactiveui

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

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

this.BindCommand(ViewModel, vm => vm.KeyDown, "KeyDown");

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

this.BindCommand(ViewModel, vm => vm.KeyDown, v => v.Form, "KeyDown");

虽然它有效但对我来说似乎是个黑客。是否有适当的方法来绑定本地事件?

2 个答案:

答案 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中更加冗长。