WPF TextBox的命令,当我们按Enter键时将触发


76

ButtonWPF应用程序中Command的绑定到VIEWMODEL类中的s非常容易。我想为达成类似的绑定TextBox

我有一个TextBox,我需要将其绑定到Command当我EnterTextBox聚焦时命中时触发的a 。目前,我正在为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!");
    }
}

有一个更好的方法吗?

Answers:


20

Aryan,并非每个WPF对象都支持命令。因此,如果您不想这样做,则需要从后面的代码中调用视图模型(有点耦合),或者使用某些MVVM Messaging实现来解耦。有关示例,请参见MVVM Light Messaging工具箱。或像这样的简单使用触发器:

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

好的,非常感谢您的答复。...但是此命令将在每个按键事件或仅回车键事件上触发?
Aryan SuryaWansi 2011年

每次。如果您只想输入,则必须编写一个标记扩展来做到这一点,就像这样:tomlev2.wordpress.com/2009/03/17/…–
Erre Efe

3
看到这是我在这里
Aryan SuryaWansi 2011年

1
谢谢。当前事件触发器为<i:InvokeCommandAction Command =“ {Binding QuickSearchTextKeyUp}” />
Nexxas 2013年

如何在多个文本框上应用此触发器
2016年

235

我遇到了同样的问题,并在这里找到了解决方案,这是代码示例:

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

16
注意,您可能需要UpdateSourceTrigger=PropertyChanged在TextBox绑定上进行设置才能起作用。
理查德·丁沃尔

这很愚蠢。除非它不适用于WPF工具包中的AutoCompleteBox,否则请参见stackoverflow.com/questions/4996731
Simon_Weaver 2014年

4
理查德·丁沃尔(Richard Dingwall)讲出了可怕的事实。我们需要做的两件事:(1)Button.IsDefault =“ True”(2)文本框文本绑定添加“ UpdateSourceTrigger = PropertyChanged”。而已。甚至sarh的答案都不会被使用。
李海媛2014年

1
@HaiyuanLi:Button.IsDefault如果每个文本框要触发不同的按钮和/或绑定的命令,则无济于事。
Ben Voigt'3

这根本不起作用。“ UpdateSourceTrigger”设置为“ PropertyChanged”。我对同一网格中的按钮使用相同的命令,但文本框不会触发它。
Matthis Kohli

16

我喜欢Sarh的答案,但是除非更改EnterReturn

<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
所有这一切都允许文本框为多行并处理按键本身,而不是触发默认按钮动作。
鲁迪·维瑟
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.