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?
Text="{Binding SearchCriteria, Mode=OneWayToSource}"
zu ,Text="{Binding SearchCriteria, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
und es wird gut funktionieren.Sie können dies tun, indem Sie die
InputBindings
Eigenschaft der TextBox alsCommandParameter
an Folgendes übergebenCommand
:<TextBox x:Name="MyTextBox"> <TextBox.InputBindings> <KeyBinding Key="Return" Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyTextBox, Path=Text}"/> </TextBox.InputBindings> </TextBox>
quelle
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.
quelle
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.
quelle
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(); } } }
quelle