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
.NET Desktop feedback