Validação Forte em TextBoxes WPF
Ao trabalhar com aplicações vinculadas a dados na Windows Presentation Foundation (WPF), a validação é crucial para garantir que as entradas dos usuários sejam tanto válidas quanto seguras. Um cenário comum envolve um TextBox
vinculado a uma propriedade decimal anulável, como altura. No entanto, um problema surge quando o TextBox
pode ainda perder o foco, mesmo quando um valor inválido é inserido. Neste post do blog, vamos explorar estratégias eficazes para implementar a validação forte em WPF, focando especificamente em dois métodos principais para lidar com o estado de entrada de um TextBox
.
O Problema: Garantindo Entrada Válida do Usuário
Considere um TextBox
em sua aplicação vinculado a uma propriedade decimal, que permite que os usuários insiram valores de altura. Quando um usuário insere um valor que não pode ser convertido para decimal, o TextBox
destaca um erro. No entanto, há o risco de que o usuário possa mover o foco para fora do TextBox
, deixando a aplicação em um estado inválido. Para resolver isso, vamos analisar duas soluções potenciais:
- Impedir que o
TextBox
perca o foco até que um valor válido seja fornecido. - Reverter o conteúdo do
TextBox
para o último valor válido quando ele perder o foco com uma entrada inválida.
Solução 1: Impedindo a Perda de Foco
Uma maneira eficaz de manter o foco no TextBox
até que uma entrada válida seja fornecida é manipular o evento PreviewLostKeyboardFocus
. Essa abordagem envolve bloquear a mudança de foco programaticamente sempre que um estado inválido é detectado. Aqui está como você pode implementar essa solução:
Implementação XAML
Primeiro, adicione um manipulador de eventos para PreviewLostKeyboardFocus
na definição do seu TextBox
:
<TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus"
Text="{Binding Height, UpdateSourceTrigger=PropertyChanged,
ValidatesOnExceptions=True,
Converter={StaticResource NullConverter}}" />
Implementação do Código C#
Em seguida, implemente o manipulador de eventos no seu código por trás para impedir a perda de foco:
private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
TextBox box = sender as TextBox;
var binding = box.GetBindingExpression(TextBox.TextProperty);
// Verificar erros de validação
if (binding.HasError) {
// Bloquear a mudança de foco
e.Handled = true;
}
}
Usando este método, o TextBox
não permitirá a perda de foco até que o usuário insira um decimal válido. Isso garante a integridade dos dados na fase de entrada.
Solução 2: Revertendo ao Último Valor Válido
Outra solução é reverter o conteúdo do TextBox
para a última entrada válida quando o foco é perdido. Isso pode ser particularmente útil em aplicações amigáveis ao usuário, onde reter o último estado válido é preferido.
Método Existente
Você pode já ter implementado uma forma básica disso no seu manipulador de eventos LostKeyboardFocus
. Para completar, aqui está como ele pode ser estruturado:
private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
TextBox box = sender as TextBox;
var binding = box.GetBindingExpression(TextBox.TextProperty);
if (binding.HasError) {
binding.UpdateTarget(); // Reverte para o último valor válido
}
}
Embora esse método funcione, pode não oferecer a solução mais elegante em cenários onde um feedback imediato é necessário. Além disso, se os usuários continuarem a fazer entradas inválidas, isso pode levar à frustração se eles estiverem confusos sobre os valores anteriores que estavam tentando inserir.
Conclusão
Implementar validação forte em controles TextBox
WPF pode melhorar significativamente a experiência do usuário ao garantir que apenas dados válidos sejam processados. Ao impedir a perda de foco ou reverter ao último valor válido, você pode manter a integridade dos dados que sua aplicação coleta. Escolha o método que melhor se adapta às necessidades da sua aplicação para fornecer uma experiência eficiente e amigável.
Ao empregar essas técnicas, você pode aprimorar a robustez de seus formulários de entrada de dados e guiar seus usuários em interações bem-sucedidas com sua aplicação.