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

本文关键字:事件 绑定 命令 | 更新日期: 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中更冗长的话。