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:

  1. Impedir que o TextBox perca o foco até que um valor válido seja fornecido.
  2. 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.