Ответ 1
Вам нужно изменить UpdateSourceTrigger
на привязку TextBox.Text
к PropertyChanged
. См. здесь.
В моем представлении 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?
Вам нужно изменить UpdateSourceTrigger
на привязку TextBox.Text
к PropertyChanged
. См. здесь.
Вы также можете сделать это в коде.
Как определить, когда нажата клавиша ввода
При проверке ввода/возврата просто вызовите код обработчика событий.
Вы можете сделать это, передав свойство 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>
Я знаю, что это 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, но это вообще не проблема.
Это также можно сделать как событие 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();
}
}
}