如何覆盖wpf中控件中的键绑定?

时间:2017-08-22 08:14:48

标签: wpf mvvm

我有以下代码,它使用Microsoft的WPFToolkit AutoCompleteBox。我已经尝试在其中添加输入绑定

xmlns:tk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"

<tk:AutoCompleteBox IsTextCompletionEnabled="True" FilterMode="Contains" ItemsSource="{Binding DistinctItemNames, Mode=OneWay}" 
        SelectedItem="{Binding SelectedItemName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
        x:Name="searchBox" Width="300" Height="23" VerticalContentAlignment="Center" >
    <tk:AutoCompleteBox.InputBindings>
        <KeyBinding Key="Return" Command="{Binding ShowSelectedItemsCommand}"/>
    <tk:AutoCompleteBox.InputBindings>
</tk:AutoCompleteBox>

然而,它不起作用。我希望控件本身处理'Enter'或'Return'键,那么如何覆盖它的默认函数呢? 我还把那个keybinding直接放在'UserControl.InputBindings'下面,但它也没有用。我讨厌使用Code Behind来处理命令逻辑。

2 个答案:

答案 0 :(得分:1)

您可以尝试直接在视图的代码隐藏中处理PreviewKeyDown事件:

private void AutoCompleteBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        AutoCompleteBox box = sender as AutoCompleteBox;
        dynamic viewModel = box.DataContext;
        viewModel.ShowSelectedItemsCommand.Execute(null);
    }
}

...或将其包装在附加行为中:https://www.codeproject.com/Articles/28959/Introduction-to-Attached-Behaviors-in-WPF

这两种方法都没有打破MVVM模式。在第一种情况下,您只是从完全相同的视图调用完全相同的视图模型命令。但如果你真的不喜欢使用代码隐藏&#34;出于某些奇怪的原因,然后创建一个附加的行为。

答案 1 :(得分:0)

试着看一下这篇文章:ReactiveCommand pass Command Parameter。 它使用Reactivity来完成你想要的任何事情。

然后,您可以处理通过KeyCode接收的密钥,并检查它是否是您想要的密钥。