Erfassen der Eingabetaste in einer Textbox


77

In meiner WPF-Ansicht versuche ich, ein Ereignis wie folgt mit der Eingabetaste zu verknüpfen:

<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>

Dieser Code funktioniert und mein EnterKeyCommand wird ausgelöst, wenn die Benutzer die Eingabetaste drücken. Das Problem ist jedoch, dass WPF beim Auslösen des Ereignisses den Text im Textfeld noch nicht an 'SearchCriteria' gebunden hat. Wenn mein Ereignis ausgelöst wird, ist der Inhalt von 'SearchCriteria' leer. Gibt es eine einfache Änderung, die ich an diesem Code vornehmen kann, damit ich den Inhalt des Textfelds abrufen kann, wenn mein EnterKey-Befehl ausgelöst wird?

Antworten:


74

Sie müssen die UpdateSourceTriggerauf Ihrer TextBox.TextBindung ändern zu PropertyChanged. Siehe hier .


Hallo micahtan Wie kann ich die Eingabetaste in PreviewTextInput erfassen?
Mahavirsinh Padhiyar

Hi @ 0MV1, die beschriebene Methode verwendet die WPF-Bindung. Wenn Sie PreviewTextInput verwenden möchten, müssen Sie stattdessen die Ereignisbehandlung verwenden.
Micahtan

9
Also, im Grunde sollte er ändern Text="{Binding SearchCriteria, Mode=OneWayToSource}"zu , Text="{Binding SearchCriteria, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"und es wird gut funktionieren.
Nimp

18

Sie können dies tun, indem Sie die InputBindingsEigenschaft der TextBox als CommandParameteran Folgendes übergeben Command:

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

Das war genau richtig! Dies und die Informationen hier haben mir durch meine Verwirrung geholfen! stackoverflow.com/questions/19847860/…
Jesse


7

Ich weiß, dass dies 6 Jahre alt ist, aber keine der Antworten liefert die richtige Antwort in ihrer Gesamtheit mit XAML und ohne Code-Behind. Ich hatte noch einige Arbeiten zu erledigen. Als Referenz ist der Ansatz der folgende. Zuerst die 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>

Grundsätzlich besteht der Ansatz darin, dass jeder Schlüssel in den gebundenen SearchText geworfen wird bei jedem Tastendruck wird. Somit ist die Zeichenfolge vollständig in SearchText vorhanden, sobald die Eingabetaste gedrückt wird. Somit ist im SearchEnterHit- Befehl die gesamte Zeichenfolge in der TextBox über die SearchText-Eigenschaft verfügbar.

Wie oben erwähnt, wird mit dem UpdateSourceTrigger = PropertyChanged jeder Tastendruck auf die SearchText- Eigenschaft geleert . Die Tastenkombinationen erfassen die Eingabetaste.

Dies ist wirklich das einfachste Mittel, um dies ohne Code-Behind und alle XAML zu tun. Sicher, Sie löschen häufig Schlüssel für die SearchText-Eigenschaft, aber das ist im Allgemeinen kein Problem.


0

Dies kann auch wie ein asynchrones Ereignis erfolgen. Hier ist das Beispiel.

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();
      }
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.