2017-08-22 15 views
1

私は、MicrosoftのWPFToolkit AutoCompleteBoxを使用する次のコードを持っています。入力バインディングを追加しようとしました。wpfのコントロールでキーバインドをオーバーライドする方法は?

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'キーを処理するので、どうすればそのデフォルト関数をオーバーライドできますか? 私はまた、 'UserControl.InputBindings'の下に直接そのキーバインドを入れて、それも動作しませんでした。コマンドロジックを処理するためにコードビハインドを使用するのは嫌です。

答えて

0

あなたは、直接ビューのコードビハインドで、PreviewKeyDownイベントを処理しようとすることができます:https://www.codeproject.com/Articles/28959/Introduction-to-Attached-Behaviors-in-WPF

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); 
    } 
} 

...または添付の行動でそれを包むことで。

いずれの方法もMVVMパターンを破棄しません。最初のケースでは、まったく同じビューからまったく同じビューモデルコマンドを呼び出すだけです。しかし、何らかの奇妙な理由でコードビハインドを使用することを本当に「嫌う」のであれば、接続された動作を作成してください。

+0

ありがとうございました。コード内のコードが最小限である限り、実際にコードの背後に問題はありません。私がここでやりたくないのは、コード内のShowSelectedItems()コードを処理することです。私はそれをビューモデルに残すことを好み、あなたの答えはそれを解決しました。それは完全に動作します。 –

0

ReactiveCommand pass Command Parameterをご覧ください。 反応性を使用して、同じ目的を達成します。

次に、KeyCodeで受信したキーを処理し、それが目的のキーであるかどうかを確認できます。

関連する問題