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:
- Prevenir que el
TextBox
pierda el foco hasta que tenga un valor válido. - 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.