我在我的应用程序中使用RelayCommand。它非常适合将代码放在视图模型中,但是如何将击键绑定到我的命令呢?
RoutedUICommand具有其InputGestures属性,该属性使命令在我按下击键时自动被调用。(作为一个额外的好处,它甚至可以在MenuItem中显示击键。)不幸的是,对于RoutedUICommand的额外属性,没有可重用的接口,所以我不能创建一个具有相同魔力的RelayUICommand。
我已经尝试过使用InputBindings:
<Window.InputBindings>
<KeyBinding Key="PageUp" Command="{Binding SelectPreviousLayerCommand}"/>
</Window.InputBindings>但这会导致运行时异常,因为KeyBinding.Command不是依赖属性。(实际上,它抱怨的是KeyBinding甚至不是DependencyObject。)因为我的RelayCommand是ViewModel上的一个属性(而不是RoutedUICommand的静态字段),所以数据绑定是我所知道的从XAML引用它的唯一方法。
你们是怎么解决这个问题的?将击键绑定到RelayCommand的最佳方式是什么?
发布于 2009-10-05 11:37:32
KeyBinding类的Command属性不支持数据绑定。这个问题将在Beta4.0中解决,你应该可以在即将发布的.NET 4.0 Beta2版本中看到这个问题。
发布于 2009-06-21 14:47:17
出于您所描述的原因,我认为您不能在XAML中做到这一点。
我最终在代码隐藏中完成了这项工作。虽然它是代码,但它只有一行代码,而且仍然是声明性的,所以我可以接受它。然而,我真的希望这个问题能在下一个版本的WPF中得到解决。
下面是我的一个项目中的一行示例代码:
this.InputBindings.Add(new KeyBinding(
((MedicContext)this.DataContext).SynchronizeCommand,
new KeyGesture(Key.F9)));本例中的SynchronizeCommand是RelayCommand的一个实例,并且(显然) F9触发了它。
发布于 2009-09-28 23:45:04
您可以子类化KeyBinding,添加一个用于设置CommandBinding属性的命令依赖属性,然后像任何其他输入绑定一样将其添加到XAML中。
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:
<Window.InputBindings>
<RelayKeyBinding
Key="PageUp"
CommandBinding="{Binding SelectPreviousLayerCommand}" />
</Window.InputBindings>https://stackoverflow.com/questions/1023960
复制相似问题