Como implementar validação de associação

Este exemplo mostra como usar um ErrorTemplate e um gatilho de estilo para fornecer comentários visuais para informar o usuário quando um valor inválido é inserido, com base em uma regra de validação personalizada.

Exemplo

O conteúdo de texto do TextBox no exemplo a seguir está vinculado à Age propriedade (do tipo int) de um objeto de origem de vinculação chamado ods. A associação é configurada para usar uma regra de validação chamada AgeRangeRule para que, se o usuário inserir caracteres não numéricos ou um valor menor que 21 ou maior que 130, um ponto de exclamação vermelho apareça ao lado da caixa de texto e uma dica de ferramenta com a mensagem de erro seja exibida quando o usuário move o mouse sobre a caixa de texto.

<TextBox Name="textBox1" Width="50" FontSize="15"
         Validation.ErrorTemplate="{StaticResource validationTemplate}"
         Style="{StaticResource textBoxInError}"
         Grid.Row="1" Grid.Column="1" Margin="2">
  <TextBox.Text>
    <Binding Path="Age" Source="{StaticResource ods}"
             UpdateSourceTrigger="PropertyChanged" >
      <Binding.ValidationRules>
        <c:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

O exemplo a seguir mostra a implementação do AgeRangeRule, que herda ValidationRule e substitui o Validate método. O Int32.Parse método é chamado no valor para certificar-se de que ele não contém caracteres inválidos. O Validate método retorna um ValidationResult que indica se o valor é válido com base em se uma exceção é capturada durante a análise e se o valor de idade está fora dos limites inferior e superior.

public class AgeRangeRule : ValidationRule
{
    public int Min { get; set; }
    public int Max { get; set; }

    public AgeRangeRule()
    {
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = Int32.Parse((String)value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, $"Illegal characters or {e.Message}");
        }

        if ((age < Min) || (age > Max))
        {
            return new ValidationResult(false,
              $"Please enter an age in the range: {Min}-{Max}.");
        }
        return ValidationResult.ValidResult;
    }
}
Public Class AgeRangeRule
    Inherits ValidationRule

    ' Properties
    Public Property Max As Integer
    Public Property Min As Integer
        
    ' Methods
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        Dim num1 As Integer = 0
        Try 
            If (CStr(value).Length > 0) Then
                num1 = Integer.Parse(CStr(value))
            End If
        Catch exception1 As Exception
            Return New ValidationResult(False, $"Illegal characters or {exception1.Message}")
        End Try
        If ((num1 < Min) OrElse (num1 > Max)) Then
            Return New ValidationResult(False, $"Please enter an age in the range: {Min}-{Max}.")
        End If
        Return ValidationResult.ValidResult
    End Function

End Class

O exemplo a seguir mostra o costume ControlTemplatevalidationTemplate que cria um ponto de exclamação vermelho para notificar o usuário de um erro de validação. Modelos de controle são usados para redefinir a aparência de um controle.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

Conforme mostrado no exemplo a seguir, o que mostra a mensagem de erro é criado usando o ToolTip estilo chamado textBoxInError. Se o valor de for true, o gatilho definirá a dica de ferramenta da corrente TextBox como seu primeiro erro de HasError validação. O RelativeSource é definido como Self, referindo-se ao elemento atual.

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Para obter o exemplo completo, consulte Exemplo de validação de vinculação.

Observe que, se você não fornecer um personalizado ErrorTemplate , o modelo de erro padrão aparecerá para fornecer comentários visuais ao usuário quando houver um erro de validação. Consulte “Validação de dados” na Visão geral de associação de dados para obter mais informações. Além disso, o WPF fornece uma regra de validação interna que captura exceções lançadas durante a atualização da propriedade de origem vinculante. Para obter mais informações, consulte ExceptionValidationRule.

Confira também