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?

Hosea146
quelle

Antworten:

74

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

Micahtan
quelle
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>
Oman
quelle
Das war genau richtig! Dies und die Informationen hier haben mir durch meine Verwirrung geholfen! stackoverflow.com/questions/19847860/…
Jesse
8

Sie können dies auch im Code dahinter tun.

Gewusst wie: Erkennen, wann die Eingabetaste gedrückt wurde

Rufen Sie bei der Prüfung auf Eingabe / Rückgabe einfach Ihren Ereignishandlercode auf.

K0D4
quelle
6
Code-Behind sollte generell vermieden werden, es sei denn, dies ist unbedingt erforderlich. Eine Eingabebindung ist viel angemessener und deklarativer.
Aaronburro
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.

Sagneta
quelle
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();
      }
  }
}
DmitryBoyko
quelle