Команда для WPF TextBox, яка спрацьовує, коли ми натискаємо клавішу Enter


76

Дуже легко прив’язати Buttons у програмах WPF до Commands у VIEWMODELкласі. Я хотів би досягти подібного прив'язки для TextBox.

У мене є, TextBoxі мені потрібно прив’язати його до а, Commandяке спрацьовує, коли я б’ю, Enterпоки TextBoxфокус сфокусований. На даний момент я використовую такий обробник для KeyUpподії, але це виглядає потворно ... і я не можу поставити його у своєму VIEWMODELкласі.

private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Enter)
    {
        // your event handler here
        e.Handled = true;
        MessageBox.Show("Enter Key is pressed!");
    }
}

Чи є кращий спосіб це зробити?

Відповіді:


20

Арійський, не кожен об’єкт WPF підтримує командування. Отже, якщо ви не хочете цього робити, вам потрібно буде або зателефонувати до своєї моделі перегляду з вашого коду позаду (трохи пов’язаного), або використовувати якусь реалізацію обміну повідомленнями MVVM, щоб роз’єднати це. Для прикладу див. Набір інструментів MVVM Light Messaging . Або просто використовуйте такі тригери:

<TextBox>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyUp">
            <i:InvokeDataCommand Command="{Binding MyCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

Гаразд, дякую вам за відповідь .... але ця команда спрацьовує на кожній події клавіші або просто на клавіші ENTER?
— Aryan SuryaWansi

Кожного разу. Якщо ви не хочете лише для входу, вам доведеться написати розширення розмітки, щоб зробити це, як це: tomlev2.wordpress.com/2009/03/17/…
— Efe

3
Дивіться, це прекрасний приклад, який я знайшов тут
— Aryan SuryaWansi

1
Дякую. Поточним активатором події є <i: InvokeCommandAction Command = "{Binding QuickSearchTextKeyUp}" />
— Nexxas

як застосувати цей тригер до декількох текстових полів
— Meer

236

Я зіткнувся з тією ж проблемою і знайшов тут рішення , ось зразок коду:

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

16
Зверніть увагу, що вам може знадобитися встановити UpdateSourceTrigger=PropertyChangedдля вашого прив'язки TextBox, щоб це працювало.
— Річард Дінгволл,

це по-дурному просто. за винятком того , не працює для AutoCompleteBox з WPF Toolkit - для цього подивитися stackoverflow.com/questions/4996731
— Simon_Weaver

4
Річард Дінгволл говорить страшну правду. нам потрібні 2 речі: (1) Button.IsDefault = "True" (2) TextBox Text Binding додає "UpdateSourceTrigger = PropertyChanged". нічого більше. навіть відповідь sarh не використовувати.
— Haiyuan Li

1
@HaiyuanLi: Button.IsDefaultне дуже допомагає, якщо кожне текстове поле має запускати іншу кнопку та / або прив'язану команду.
— Ben Voigt

Це взагалі не працює. Для 'UpdateSourceTrigger' встановлено значення 'PropertyChanged'. Я використовую ту саму команду для кнопки в тій самій сітці, але текстове поле її не запускає.
— Маттіс Колі

16

Мені подобається відповідь Сарха, але вона не спрацювала б у моїй програмі, якщо б я не змінив Enterна Return:

<TextBox>
    <TextBox.InputBindings>
        <KeyBinding Key="Return" Command="{}" />
   </TextBox.InputBindings>
</TextBox>

Я зробив такий же досвід
— Хайнц Кесслер,

1
<TextBox Text="{Binding FieldThatIAmBindingToo, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding AddCommand}" Key="Return" />
    </TextBox.InputBindings>
</TextBox>

Я взяв відповідь звідси


-9

Ви можете встановити значення true для властивості AcceptReturn.

 <TextBox AcceptsReturn="True" />

12
Все це дозволяє дозволити текстовому полі бути багаторядковим і обробляти саме натискання клавіші, а не запускати дію кнопки за замовчуванням.
— Руді Віссер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.