WPF MVVM中的键盘快捷键?

14

我有一个遵循MVVM模式的WPF应用程序。我需要实现键盘快捷键。这些快捷键必须控制WebBrowser控件的行为。我定义了第一个自定义命令并将其添加到视图的输入绑定中。还将有更多命令需要调用浏览器上的脚本:

MainWindow.xaml.cs:

        ...

        CommandBinding cb = new CommandBinding(RemoteControlCommands.TestCommand, MyCommandExecuted,  MyCommandCanExecute);
        this.CommandBindings.Add(cb);

        KeyGesture kg = new KeyGesture(Key.Q, ModifierKeys.Control);
        InputBinding ib = new InputBinding(RemoteControlCommands.TestCommand, kg);
        this.InputBindings.Add(ib);
    }

    private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        webBrowser.InvokeScript("foo", "Hello World!");
    }

    private void MyCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

我的问题是如何将这个问题融入MVVM模式? MVVM对我来说是一个新概念,但我了解如何将视图的命令绑定到视图模型,并在那里执行方法或更改属性。然而,在这种情况下,我需要在视图中的控件上执行一个方法。在这种情况下,最好的快捷方式处理位置在哪里?

1个回答

47
<Window.InputBindings>
  <KeyBinding Command="{Binding MyCommand, Source=viewModel...}"
              CommandParameter="{Binding,ElementName=browserControl,Mode=Self}"
              Gesture="CTRL+R" />
</Window.InputBindings>

你可以将命令属性绑定到视图模型的命令。


然后呢?视图模型不知道在我想要调用方法的视图中的WebBrowser控件。 - jlp
您可以将命令参数绑定到一些值,例如WebBrowser本身,并在委托方法中检索它。 - Akash Kava
4
请注意,Akash Kava的答案仅适用于.NET 4.0及以上版本,因为在.NET 3.5中,KeyBinding.CommandKeyBinding.CommandParameter不是依赖属性。 - Rafael Costa
还需注意另一个要点:如果您在 bound 命令中包含保护条件,当这些条件被判定为 false 时,Caliburn 将禁用整个视图。我通过使用不同名称的"重载"操作方式,并针对键盘快捷键以及任何相关控件(例如菜单项)进行了解决,所有这些均会调用相同的命令。 - RJ Lohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接