Como Implementar a Validação de Ligação
Este exemplo mostra como usar um ErrorTemplate e um gatilho de estilo para fornecer feedback visual 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 à propriedade Age
(do tipo int) de um objeto de origem de ligaçã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 aparecerá ao lado da caixa de texto e uma dica de ferramenta com a mensagem de erro aparecerá quando o usuário mover 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 do AgeRangeRule
, que herda de ValidationRule e substitui o método Validate. O método Int32.Parse
é chamado no valor para certificar-se de que ele não contém caracteres inválidos. O método Validate retorna um ValidationResult que indica se o valor é válido com base em se uma exceção é detetada 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 ControlTemplatevalidationTemplate
personalizado que cria um ponto de exclamação vermelho para notificar o usuário de um erro de validação. Os 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>
Como mostrado no exemplo a seguir, o ToolTip que mostra a mensagem de erro é criado usando o estilo chamado textBoxInError
. Se o valor de HasError for true
, o gatilho define a dica de ferramenta do TextBox atual como seu primeiro erro de validação. O RelativeSource está 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 trecho 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 vinculação.
Observe que, se você não fornecer um ErrorTemplate personalizado, 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 da vinculaçã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 da vinculação. Para obter mais informações, consulte ExceptionValidationRule.
Ver também
- Visão geral da vinculação de dados
- Tópicos de instruções
.NET Desktop feedback