c# - WPF:Enterボタンを押したときに検索フィールドでコマンドバインディングを実行する



wpf textblock enter key (3)

私はコマンドバインディングを含む検索ボタンを使ってWPFアプリケーション内に検索フィールドを持っています。 これは素晴らしいですが、キーボードのEnterキーを押したときに、テキストフィールドに同じコマンドバインディングを使用する方法はありますか? 私が見てきた例はすべて、KeyDownイベントハンドラのコードビハインドを使用しています。 xamlとコマンドバインディングだけでこの作業をするスマートな方法はありますか?


Answer #1

Prism Reference Implementationには、あなたが行っていることを正確に実装しています。

基本的な手順は次のとおりです。

  • 静的クラスを作成するEnterKey
  • EnterKeyのICommand型の添付プロパティ "Command"の登録
  • EnterKeyのEnterKeyCommandBehaviorタイプの登録された接続プロパティ "EnterKeyCommandBehavior"
  • "Command"の値が変更されたら、EnterKeyCommandBehaviorの新しいインスタンスとしてコントロールに "EnterKeyCommandBehavior"を添付し、ICommandをビヘイビアのCommandプロパティに割り当てます。
    • ビヘイビアが既にアタッチされている場合は、既存のインスタンスを使用します
  • EnterKeyCommandBehaviorはコンストラクタのUIElementを受け取り、PreviewKeyDown(またはSilverlightとの互換性を維持する場合はKeyDown)にアタッチします。
  • イベントハンドラで、キーがEnterの場合は、ICommandを実行します(CanExecuteがtrueの場合)。

これにより、次のような動作を使用することができます。

<TextBox prefix:EnterKey.Command="{Binding Path=SearchCommand}" />

Answer #2

ボタンのIsDefaultプロパティを使用することができます:

    <Button Command="SearchCommand" IsDefault="{Binding ElementName=SearchTextBox,
                                               Path=IsKeyboardFocused}">
         Search!
   </Button>

Answer #3

私はGreg SamsonのTextBox.Inputsソリューションを試しましたが、依存プロパティを使ってtextinputsにしかバインドできないというエラーがありました。 最後に私はこのための次の解決策を見つけました。

次のようなCommandReferenceというクラスを作成します。

public class CommandReference : Freezable, ICommand
{
    public CommandReference()
    {
        //
    }

    public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));

    public ICommand Command
    {
        get { return (ICommand)GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }

    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        if (Command != null)
            return Command.CanExecute(parameter);
        return false;
    }

    public void Execute(object parameter)
    {
        Command.Execute(parameter);
    }

    public event EventHandler CanExecuteChanged;

    private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        CommandReference commandReference = d as CommandReference;
        ICommand oldCommand = e.OldValue as ICommand;
        ICommand newCommand = e.NewValue as ICommand;

        if (oldCommand != null)
        {
            oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
        }
        if (newCommand != null)
        {
            newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
        }
    }

    #endregion

    #region Freezable

    protected override Freezable CreateInstanceCore()
    {
        throw new NotImplementedException();
    }

    #endregion
}

XamlでこれをUserControlリソースに追加します:

<UserControl.Resources>
    <Base:CommandReference x:Key="SearchCommandRef" Command="{Binding Path = SomeCommand}"/>

実際のTextBoxは次のようになります。

 <TextBox Text="{Binding Path=SomeText}">
                    <TextBox.InputBindings>
                        <KeyBinding Command="{StaticResource SearchCommandRef}" Key="Enter"/>
                    </TextBox.InputBindings>
                </TextBox>

私はこのコードをどこから入手したのか覚えていませんが、このサイトでも同様に説明されています。

http://www.netframeworkdev.com/windows-presentation-foundation-wpf/invoke-a-command-with-enter-key-after-typing-in-a-textbox-21909.shtml





commandbinding