首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按键绑定RelayCommand

按键绑定RelayCommand
EN

Stack Overflow用户
提问于 2009-06-21 13:58:49
回答 6查看 19.5K关注 0票数 27

我在我的应用程序中使用RelayCommand。它非常适合将代码放在视图模型中,但是如何将击键绑定到我的命令呢?

RoutedUICommand具有其InputGestures属性,该属性使命令在我按下击键时自动被调用。(作为一个额外的好处,它甚至可以在MenuItem中显示击键。)不幸的是,对于RoutedUICommand的额外属性,没有可重用的接口,所以我不能创建一个具有相同魔力的RelayUICommand。

我已经尝试过使用InputBindings:

代码语言:javascript
复制
<Window.InputBindings>
    <KeyBinding Key="PageUp" Command="{Binding SelectPreviousLayerCommand}"/>
</Window.InputBindings>

但这会导致运行时异常,因为KeyBinding.Command不是依赖属性。(实际上,它抱怨的是KeyBinding甚至不是DependencyObject。)因为我的RelayCommand是ViewModel上的一个属性(而不是RoutedUICommand的静态字段),所以数据绑定是我所知道的从XAML引用它的唯一方法。

你们是怎么解决这个问题的?将击键绑定到RelayCommand的最佳方式是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-05 11:37:32

KeyBinding类的Command属性不支持数据绑定。这个问题将在Beta4.0中解决,你应该可以在即将发布的.NET 4.0 Beta2版本中看到这个问题。

票数 14
EN

Stack Overflow用户

发布于 2009-06-21 14:47:17

出于您所描述的原因,我认为您不能在XAML中做到这一点。

我最终在代码隐藏中完成了这项工作。虽然它是代码,但它只有一行代码,而且仍然是声明性的,所以我可以接受它。然而,我真的希望这个问题能在下一个版本的WPF中得到解决。

下面是我的一个项目中的一行示例代码:

代码语言:javascript
复制
this.InputBindings.Add(new KeyBinding(
    ((MedicContext)this.DataContext).SynchronizeCommand,
    new KeyGesture(Key.F9)));

本例中的SynchronizeCommand是RelayCommand的一个实例,并且(显然) F9触发了它。

票数 17
EN

Stack Overflow用户

发布于 2009-09-28 23:45:04

您可以子类化KeyBinding,添加一个用于设置CommandBinding属性的命令依赖属性,然后像任何其他输入绑定一样将其添加到XAML中。

代码语言:javascript
复制
public class RelayKeyBinding : KeyBinding
{
    public static readonly DependencyProperty CommandBindingProperty =
        DependencyProperty.Register("CommandBinding", typeof(ICommand), 
        typeof(RelayKeyBinding),
        new FrameworkPropertyMetadata(OnCommandBindingChanged));
    public ICommand CommandBinding
    {
        get { return (ICommand)GetValue(CommandBindingProperty); }
        set { SetValue(CommandBindingProperty, value); }
    }

    private static void OnCommandBindingChanged(
        DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var keyBinding = (RelayKeyBinding)d;
        keyBinding.Command = (ICommand)e.NewValue;
    }
}

XAML:

代码语言:javascript
复制
<Window.InputBindings>
    <RelayKeyBinding 
        Key="PageUp" 
        CommandBinding="{Binding SelectPreviousLayerCommand}" />
</Window.InputBindings>
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1023960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档