我有以下代码,它使用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来处理命令逻辑。
答案 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接收的密钥,并检查它是否是您想要的密钥。