Validación Fuerte en TextBoxes de WPF

Cuando se trabaja con aplicaciones vinculadas a datos en Windows Presentation Foundation (WPF), la validación es crucial para asegurar que las entradas del usuario sean tanto válidas como seguras. Un escenario común involucra un TextBox vinculado a una propiedad decimal que permite nulos, como la altura. Sin embargo, surge un problema cuando el TextBox puede aún perder el foco incluso cuando se introduce un valor inválido. En esta entrada del blog, exploraremos estrategias efectivas para implementar validación fuerte en WPF, enfocándonos específicamente en dos métodos clave para manejar el estado de entrada de un TextBox.

El Problema: Asegurando Entradas Válidas del Usuario

Considera un TextBox en tu aplicación vinculado a una propiedad decimal, que permite a los usuarios ingresar valores de altura. Cuando un usuario ingresa un valor que no se puede convertir a decimal, el TextBox resalta un error. Sin embargo, existe el riesgo de que el usuario mueva el foco del TextBox, dejando la aplicación en un estado inválido. Para abordar esto, analizaremos dos posibles soluciones:

  1. Prevenir que el TextBox pierda el foco hasta que tenga un valor válido.
  2. Revertir el contenido del TextBox al último valor válido cuando pierda el foco con una entrada inválida.

Solución 1: Previniendo la Pérdida de Foco

Una forma efectiva de mantener el foco en el TextBox hasta que se proporcione una entrada válida es manejar el evento PreviewLostKeyboardFocus. Este enfoque implica bloquear programáticamente el cambio de foco cada vez que se detecta un estado inválido. Así es como puedes implementar esta solución:

Implementación en XAML

Primero, añade un manejador de eventos para PreviewLostKeyboardFocus en la definición de tu TextBox:

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

Implementación en Código C#

A continuación, implementa el manejador de eventos en tu código subyacente para prevenir la pérdida de foco:

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
    TextBox box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    
    // Verificar errores de validación
    if (binding.HasError) {
        // Bloquear el cambio de foco
        e.Handled = true;
    }
}

Al usar este método, el TextBox no permitirá la pérdida de foco hasta que el usuario haya ingresado un decimal válido. Esto asegura la integridad de los datos en la etapa de entrada.

Solución 2: Revirtiendo al Último Valor Válido

Otra solución es revertir el contenido del TextBox a la última entrada válida cuando se pierde el foco. Esto puede ser particularmente útil en aplicaciones amigables con el usuario donde se prefiere retener el último estado válido.

Método Existente

Es posible que ya hayas implementado una forma básica de esto en tu manejador de eventos de LostKeyboardFocus. Para completarlo, aquí se explica cómo se puede estructurar:

private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
    TextBox box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    
    if (binding.HasError) {
        binding.UpdateTarget(); // Revierte al último valor válido
    }
}

Si bien este método funciona, puede que no ofrezca la solución más elegante en escenarios donde se requiere retroalimentación inmediata. Además, si los usuarios continúan haciendo entradas inválidas, puede generar frustración si están confundidos acerca de los valores anteriores que intentaban ingresar.

Conclusión

Implementar validación fuerte en los controles TextBox de WPF puede mejorar significativamente la experiencia del usuario al asegurar que solo se procesen datos válidos. Ya sea previniendo la pérdida de foco o revirtiendo al último valor válido, puedes mantener la integridad de los datos que tu aplicación recopila. Elige el método que mejor se adapte a las necesidades de tu aplicación para proporcionar una experiencia eficiente y amigable para el usuario.

Al emplear estas técnicas, puedes aumentar la robustez de tus formularios de entrada de datos y llevar a tus usuarios hacia interacciones exitosas con tu aplicación.