Como implementar validação de associação

Este exemplo mostra como usar um ErrorTemplate gatilho de estilo e um 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á associado à Age propriedade (do tipo int) de um objeto de origem de associaçã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>
        <local:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

O exemplo a seguir mostra a implementação de AgeRangeRule, que herda e ValidationRule substitui o Validate método. O Int32.Parse método é chamado no valor para garantir que ele não contenha 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 override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = int.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 personalizado ControlTemplate validationTemplate que cria um ponto de exclamação vermelho para notificar o usuário sobre 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 ToolTip que mostra a mensagem de erro é criado usando o estilo chamado textBoxInError. Se o valor for HasError true, o gatilho definirá a dica de ferramenta da corrente TextBox para seu primeiro erro de 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)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Objeto de dados

O snippet a seguir é o objeto de dados usado nos exemplos de código anteriores. Uma instância é criada no XAML como um recurso estático com a chave de ods:

public class MyDataSource
{
    public MyDataSource()
    {
        Age = 0;
        Age2 = 0;
    }

    public int Age { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
}
Public Class MyDataSource
    Public Sub New()
        Me.Age = 0
        Me.Age2 = 0
    End Sub

    Public Property Age As Integer
    Public Property Age2 As Integer
    Public Property Age3 As Integer
End Class

Exemplo completo

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

Observe que, se você não fornecer um personalizado ErrorTemplate , o modelo de erro padrão aparecerá para fornecer feedback visual 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 geradas durante a atualização da propriedade de origem da associação. Para obter mais informações, consulte ExceptionValidationRule.

Confira também