捕获文本框中的Enter键


77

在我的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>

该代码有效,当用户按下Enter键时,我的EnterKeyCommand将触发。但是,问题在于,当事件触发时,WPF尚未将文本框中的文本绑定到“ SearchCriteria”。因此,当我的事件触发时,“ SearchCriteria”的内容为空白。我可以在这段代码中做一个简单的更改,以便在EnterKey命令触发时获取文本框的内容吗?

Answers:


74

您需要将绑定UpdateSourceTrigger上的更改TextBox.TextPropertyChanged。看这里


micahtan嗨,我如何在PreviewTextInput中捕获Enter键?
Mahavirsinh Padhiyar'Feb

@ 0MV1,您好,概述的方法使用WPF绑定。如果要使用PreviewTextInput,则必须使用事件处理。
micahtan '16

9
因此,基本上,他应该更改Text="{Binding SearchCriteria, Mode=OneWayToSource}"Text="{Binding SearchCriteria, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}",它将正常工作。
Nimp

18

您可以通过将TextBox的InputBindings属性作为传递CommandParameterCommand

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

这是现场!这加上这里的信息,帮助我度过了困惑! stackoverflow.com/questions/19847860/...
杰西


7

我知道这已经有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中。因此,在SearchEnterHit命令中,可通过SearchText属性使用TextBox中的整个字符串。

如上所述,UpdateSourceTrigger = PropertyChanged是将每次击键刷新到SearchText属性的方法。KeyBindings捕获Enter键。

这实际上是最简单的方法,不需要任何代码,也不需要所有XAML。确保您经常刷新SearchText属性的键,但这通常不是问题。


0

它也可以像异步事件一样完成。这是例子。

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();
      }
  }
}
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.