我在Window中有一些输入法:
<Window.InputBindings>
<KeyBinding Key="Space" Command="{Binding Path=StepNext}" />
<KeyBinding Key="R" Command="{Binding Path=ResetSong}" />
<KeyBinding Key="Left" Command="{Binding Path=StepPrevious}" />
</Window.InputBindings>
命令在我的viewmodel中定义为RelayCommands:
public class RelayCommand : ICommand
{
private Action<object> _exec;
private Func<object, bool> _canExec;
public RelayCommand(Action<object> exec, Func<object, bool> canExec)
{
_exec = exec;
_canExec = canExec;
}
public void Execute(object parameter)
{
_exec(parameter);
}
public bool CanExecute(object parameter)
{
return _canExec(parameter);
}
public event EventHandler CanExecuteChanged;
}
在ViewModel的构造函数中:
StepNext = new RelayCommand(DoStepNext, CanStepNext);
这很好用。但是,每当我在列表框中选择一个项目(它是Window的子项)时,KeyBindings就会停止工作。如何让父项捕获键绑定,而不管哪个子项具有焦点(如果有)。 (不管事件不应该冒泡吗?)
我知道有一个PreviewKeyDown事件可以做到这一点,但这会使我的ICommand
无用,所以如果可能的话我更喜欢声明性的解决方案。
提前致谢。
答案 0 :(得分:0)
据我所知,没有声明性方法可以让处理事件继续冒泡。
正如您所说,最简单的方法是处理Preview
事件。
作为替代方法,您可以覆盖ListBox
类OnKeyDown方法,如下所示:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.Key == Key.Space || e.Key == Key.Left)
e.Handled = false;
}