WPF: Execute a Command Binding in a search field when pressing the enter button

11,201

Solution 1

You can use the IsDefault property of the button:

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

Solution 2

The accepted answer only works if you already have a button bound to the command.

To avoid this limitation, use TextBox.InputBindings:

<TextBox.InputBindings>
    <KeyBinding Key="Enter" Command="{Binding Path=MyCommand}"></KeyBinding>
</TextBox.InputBindings>

Solution 3

The Prism Reference Implementation contains an implementation of exactly what you are after.

The basics steps are:

  • Create a static class EnterKey
  • Registered attached property "Command" of type ICommand on EnterKey
  • Registered attached property "EnterKeyCommandBehavior" of type EnterKeyCommandBehavior on EnterKey
  • When the value of "Command" changes, attach "EnterKeyCommandBehavior" to the control as a new instance of EnterKeyCommandBehavior, and assign the ICommand to the behavior's Command property.
    • If the behavior is already attached, use the existing instance
  • EnterKeyCommandBehavior accepts a UIElement in the constructor and attaches to the PreviewKeyDown (or KeyDown if you want to stay Silverlight compatible).
  • In the event handler, if the key is Enter, execute the ICommand (if CanExecute is true).

This enables you to use the behavior like so:

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

Solution 4

<TextBox Text="{Binding SerachString, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding SearchCommand}" Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

this should work fine.100%

Share:
11,201
code-zoop
Author by

code-zoop

Updated on June 25, 2022

Comments

  • code-zoop
    code-zoop about 2 years

    I have a search field in my WPF app with a search button that contains a command binding. This works great, but how can i use the same command binding for the text field when pressing enter on the keyboard? The examples I have seen are all using the Code behind with a KeyDown Event Handler. Is there a smart way to make this work only with xaml and command binding?

  • code-zoop
    code-zoop over 14 years
    Thanks, easy and clean. Works great!
  • Scott
    Scott over 11 years
    I additionally had to change the UpdateSourceTrigger on my TextBox.Text binding to get this to work. For more details, check out Capturing the Enter key in a TextBox.
  • ihake
    ihake over 10 years
    What if you don't have a button?
  • Brandon
    Brandon over 9 years
    This works the first time I press enter. I continue editing the search and press enter and it doesn't perform the search. I have to manually click back on the search control to get it to perform another search when I press enter.
  • Brandon
    Brandon over 9 years
    Nevermind--I'm an idiot. I forgot to add UpdateSourceTrigger=PropertyChanged on the TextBox :D
  • kenjara
    kenjara over 6 years
    This should be the accepted answer. It works great is clean where as the accepted answer is a bit of a hack.