Starke Validierung in WPF-TextBoxen

Bei der Arbeit mit datenbindenden Anwendungen in Windows Presentation Foundation (WPF) ist die Validierung entscheidend, um sicherzustellen, dass Benutzereingaben sowohl gültig als auch sicher sind. Ein häufiges Szenario ist ein TextBox, das an eine nullable Dezimal-Eigenschaft gebunden ist, wie zum Beispiel Höhe. Ein Problem tritt auf, wenn der TextBox den Fokus verlieren kann, selbst wenn ein ungültiger Wert eingegeben wird. In diesem Blogbeitrag werden wir effektive Strategien zur Implementierung einer starken Validierung in WPF erkunden, wobei wir uns speziell auf zwei wesentliche Methoden konzentrieren, um den Eingabestatus eines TextBox zu handhaben.

Das Problem: Sicherstellung gültiger Benutzereingaben

Betrachten Sie einen TextBox in Ihrer Anwendung, der an eine Dezimal-Eigenschaft gebunden ist, die es Benutzern ermöglicht, Höhenwerte einzugeben. Wenn ein Benutzer einen Wert eingibt, der nicht in eine Dezimalzahl umgewandelt werden kann, hebt der TextBox einen Fehler hervor. Es besteht jedoch das Risiko, dass der Benutzer den Fokus vom TextBox wegnimmt, was die Anwendung in einem ungültigen Zustand belässt. Zur Lösung dieses Problems werden wir zwei mögliche Lösungen betrachten:

  1. Verhindern, dass der TextBox den Fokus verliert, bis ein gültiger Wert eingegeben wird.
  2. Den Inhalt des TextBox auf den letzten gültigen Wert zurücksetzen, wenn er mit einer ungültigen Eingabe den Fokus verliert.

Lösung 1: Verhindern des Fokusverlusts

Eine effektive Methode, um den Fokus auf dem TextBox zu halten, bis eine gültige Eingabe bereitgestellt wird, besteht darin, das PreviewLostKeyboardFocus-Ereignis zu behandeln. Dieser Ansatz beinhaltet das programmgesteuerte Blockieren des Fokuswechsels, wann immer ein ungültiger Zustand erkannt wird. So können Sie diese Lösung implementieren:

XAML-Implementierung

Fügen Sie zunächst einen Ereignishandler für PreviewLostKeyboardFocus in Ihrer TextBox-Definition hinzu:

<TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" 
         Text="{Binding Height, UpdateSourceTrigger=PropertyChanged, 
                         ValidatesOnExceptions=True, 
                         Converter={StaticResource NullConverter}}" />

C# Code-Implementierung

Implementieren Sie als Nächstes den Ereignishandler in Ihrem Code-Behind, um den Fokusverlust zu verhindern:

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
    TextBox box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    
    // Überprüfen auf Validierungsfehler
    if (binding.HasError) {
        // Fokuswechsel blockieren
        e.Handled = true;
    }
}

Mit dieser Methode wird der TextBox den Fokus nicht verlieren, bis der Benutzer eine gültige Dezimalzahl eingegeben hat. Dies gewährleistet die Datenintegrität in der Eingabestufe.

Lösung 2: Rücksetzen auf den letzten gültigen Wert

Eine weitere Lösung besteht darin, den Inhalt des TextBox auf den letzten gültigen Eintrag zurückzusetzen, wenn der Fokus verloren geht. Dies kann besonders nützlich in benutzerfreundlichen Anwendungen sein, in denen es bevorzugt wird, den letzten gültigen Zustand beizubehalten.

Bestehende Methode

Möglicherweise haben Sie bereits eine grundlegende Form davon in Ihrem LostKeyboardFocus-Ereignishandler implementiert. Hier ist, wie es strukturiert werden kann:

private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
    TextBox box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    
    if (binding.HasError) {
        binding.UpdateTarget(); // Rücksetzen auf den letzten gültigen Wert
    }
}

Obwohl diese Methode funktioniert, bietet sie möglicherweise nicht die eleganteste Lösung in Szenarien, in denen sofortiges Feedback erforderlich ist. Darüber hinaus kann es zu Frustration führen, wenn die Benutzer weiterhin ungültige Eingaben machen, da sie über frühere Werte, die sie eingeben wollten, verwirrt sind.

Fazit

Die Implementierung einer starken Validierung in WPF-TextBox-Steuerelementen kann das Benutzererlebnis erheblich verbessern, da sichergestellt wird, dass nur gültige Daten verarbeitet werden. Durch das Verhindern des Fokusverlusts oder das Zurücksetzen auf den letzten gültigen Wert können Sie die Integrität der Daten, die Ihre Anwendung erfasst, aufrechterhalten. Wählen Sie die Methode, die am besten zu den Anforderungen Ihrer Anwendung passt, um ein effizientes und benutzerfreundliches Erlebnis zu bieten.

Durch den Einsatz dieser Techniken können Sie die Robustheit Ihrer Dateneingabeformulare verbessern und Ihre Benutzer zu erfolgreichen Interaktionen mit Ihrer Anwendung führen.