Comment : implémenter la validation de la liaison
Cet exemple montre comment utiliser un ErrorTemplate et un déclencheur de style pour fournir la rétroaction visuelle pour signaler à l'utilisateur l'entrée d'une valeur non valide en fonction d'une règle de validation personnalisée.
Exemple
Le contenu de texte de la TextBox dans l'exemple suivant est lié à la propriété Age (de type int) d'un objet de source de liaison nommé ods. La liaison est définie pour utiliser la règle de validation AgeRangeRule pour que, lorsque l'utilisateur entre des caractères non numériques ou une valeur inférieure à 21 ou supérieure à 130, un point d'exclamation rouge apparaisse à côté de la zone de texte et une info-bulle avec le message d'erreur s'affiche lorsque l'utilisateur place le pointeur de la souris sur la zone de texte.
<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>
L'exemple suivant montre l'implémentation AgeRangeRule qui hérite de ValidationRule et remplace la méthode Validate. La méthode Int32.Parse () est appelée sur la valeur pour vérifier qu'elle ne contient pas de caractères non valides. La méthode Validate retourne un ValidationResult qui indique si la valeur est valide en fonction de l'interception d'une exception pendant l'analyse et si la valeur d'âge ne se trouve pas entre la limite inférieure et la limite supérieure.
public class AgeRangeRule : ValidationRule
{
private int _min;
private int _max;
public AgeRangeRule()
{
}
public int Min
{
get { return _min; }
set { _min = value; }
}
public int Max
{
get { return _max; }
set { _max = value; }
}
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 + ".");
}
else
{
return new ValidationResult(true, null);
}
}
}
L'exemple suivant montre le ControlTemplatevalidationTemplate personnalisé qui crée un point d'exclamation rouge pour signaler à l'utilisateur une erreur de validation. Les modèles de contrôle sont utilisés pour redéfinir l'apparence d'un contrôle.
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
Comme indiqué dans l'exemple suivant, l'ToolTip qui affiche le message d'erreur est créée à l'aide du style textBoxInError. Si la valeur de HasError est true, le déclencheur affecte à l'info-bulle de la TextBox actuelle sa première erreur de validation. La RelativeSource a la valeur Self en faisant référence à l'élément actuel.
<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>
Pour obtenir l'exemple complet, consultez Validation de liaison, exemple.
Notez que si vous ne fournissez pas un ErrorTemplate personnalisé, le modèle d'erreur par défaut apparaît pour fournir la rétroaction visuelle à l'utilisateur lorsqu'il existe une erreur de validation. Consultez la rubrique « Validation des données » dans Vue d'ensemble de la liaison de données pour plus d'informations. En outre, WPF fournit une règle de validation intégrée qui intercepte les exceptions levées pendant la mise à jour de la propriété de source de liaison. Pour plus d'informations, consultez ExceptionValidationRule.
Voir aussi
Concepts
Vue d'ensemble de la liaison de données