Захват клавиши Enter в текстовом поле

В моем представлении WPF я пытаюсь связать событие с ключом Enter следующим образом:

<TextBox Width="240" VerticalAlignment="Center" Margin="2" Text="{Binding SearchCriteria, Mode=OneWayToSource}">
  <TextBox.InputBindings>
      <KeyBinding Key="Enter" Command="{Binding EnterKeyCommand}"/>
      <KeyBinding Key="Tab" Command="{Binding TabKeyCommand}"/>
  </TextBox.InputBindings>
</TextBox>

Этот код работает, и мой EnterKeyCommand запускается, когда пользователи нажимают клавишу Enter. Однако проблема заключается в том, что когда событие срабатывает, WPF еще не привязал текст в текстовом поле к "SearchCriteria". Поэтому, когда мое событие срабатывает, содержимое "SearchCriteria" пустое. Есть ли простое изменение, которое я могу сделать в этом коде, чтобы я мог получить содержимое текстового поля при срабатывании моей команды EnterKey?

Ответ 1

Вам нужно изменить UpdateSourceTrigger на привязку TextBox.Text к PropertyChanged. См. здесь.

Ответ 3

Вы можете сделать это, передав свойство TextBox InputBindings как CommandParameter в Command:

<TextBox x:Name="MyTextBox">
    <TextBox.InputBindings>
        <KeyBinding Key="Return" 
                    Command="{Binding MyCommand}"
                    CommandParameter="{Binding ElementName=MyTextBox, Path=Text}"/>
    </TextBox.InputBindings>
</TextBox>

Ответ 4

Я знаю, что это 6 лет, но ни один из ответов не дает правильного ответа в полной мере с использованием XAML и без кода. Мне все еще нужно было кое-что сделать. Для справки подход заключается в следующем. Сначала XAML

 <TextBox Text="{Binding SearchText, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Key="Enter" Command="{Binding SearchEnterHit}"/>
            <KeyBinding Key="Return" Command="{Binding SearchEnterHit}"/>
        </TextBox.InputBindings>
    </TextBox>

В основном подход заключается в том, что каждый ключ перебрасывается в связанный SearchText при каждом нажатии клавиши. Таким образом, строка будет полностью присутствовать в SearchText после нажатия кнопки return/enter. Таким образом, в команде SearchEnterHit вся строка в TextBox доступна через свойство SearchText.

Как уже упоминалось выше, UpdateSourceTrigger = PropertyChanged - это то, что сбрасывает каждое нажатие клавиши на свойство SearchText. KeyBindings захватывает ключ ввода.

Это действительно самый простой способ сделать это без кода и всего XAML. Уверен, что вы часто краснете ключи к свойству SearchText, но это вообще не проблема.

Ответ 5

Это также можно сделать как событие async. Вот пример.

tbUsername.KeyDown += async (s, e) => await OnKeyDownHandler(s, e);  

private async Task OnKeyDownHandler(object sender, KeyEventArgs e)
{
   if (e.Key == Key.Return)
   {
      if (!string.IsNullOrEmpty(tbUsername.Text) && !string.IsNullOrEmpty(tbPassword.Password))
      {
          Overlay.Visibility = Visibility.Visible;
          await Login();
      }
  }
}