Команда для 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.