Cet article présente une approche pour implémenter la validation des données dans une application WPF en utilisant un modèle de validation personnalisé.
Étape 1 : Définition du modèle de validation
Créez une classe qui encapsule les règles de validation. Les propriétés de cette classe lèvent des exceptions lorsque les données ne sont pas valides.
using System;
using System.Text.RegularExpressions;
namespace WpfValidation
{
public class ValidationRegles
{
private const string ModeleTelephone = @"^\d{10}$";
private const string ModeleCodePostal = @"^\d{5}$";
private const string CaractereEntier = @"^[\x20-\x7E]*$";
private string _nomRequis;
private string _emailRequis;
private string _codePostal;
public string NomRequis
{
get => _nomRequis;
set
{
if (string.IsNullOrWhiteSpace(value))
{
throw new InvalidOperationException("Le champ ne peut pas être vide.");
}
_nomRequis = value;
}
}
public string EmailRequis
{
get => _emailRequis;
set
{
if (string.IsNullOrWhiteSpace(value) || !Regex.IsMatch(value, @"^[^@\s]+@[^@\s]+\.[^@\s]+$"))
{
throw new InvalidOperationException("Format d'email invalide.");
}
_emailRequis = value;
}
}
public string CodePostal
{
get => _codePostal;
set
{
if (!Regex.IsMatch(value, CaractereEntier) || !Regex.IsMatch(value, ModeleCodePostal))
{
throw new InvalidOperationException("Doit être un code postal à 5 chiffres.");
}
_codePostal = value;
}
}
}
}
Étape 2 : Ajouter le modèle aux ressources statiques de la fenêtre
Dans le fichier XAML de la fenêtre, ajoutez l'espace de noms et déclarez le modèle comme ressource.
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:val="clr-namespace:WpfValidation"
Title="Validation Exemple" Height="450" Width="800">
<Window.Resources>
<val:ValidationRegles x:Key="reglesVal"/>
</Window.Resources>
Étape 3 : Lier les contrôles aux propriétés du modèle avec validation
Liez la propriété Text d'un TextBox à une propriété du modèle et appliquez la règle de validation par exception.
<StackPanel Margin="20">
<TextBox Name="txtNom" Width="300" Margin="0,10">
<TextBox.Text>
<Binding Source="{StaticResource reglesVal}" Path="NomRequis" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
Étape 4 : Créer un template pour afficher les erreurs
Définissez un ControlTemplate qui affichera le message d'erreur en rouge sous le contrôle en erreur.
<Window.Resources>
...
<ControlTemplate x:Key="templateErreur">
<StackPanel>
<AdornedElementPlaceholder Name="contenuPlaceur"/>
<TextBlock Foreground="Red" Margin="0,2,0,0"
Text="{Binding ElementName=contenuPlaceur, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
</StackPanel>
</ControlTemplate>
</Window.Resources>
Étape 5 : Appliquer le template et configurer le décelnchement de la validation
Assignez le template d'erreur au contrôle et assurez-vous que la validation se déclenche à chaque changement de texte.
<TextBox Name="txtNom" Width="300" Margin="0,10"
Validation.ErrorTemplate="{StaticResource templateErreur}">
<TextBox.Text>
<Binding Source="{StaticResource reglesVal}" Path="NomRequis"
UpdateSourceTrigger="PropertyChanged"
NotifyOnValidationError="True">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Étape 6 : Vérifier la validité avant une soumission
Lors d'une action de soumission (clic sur un bouton), il est possible de vérifier explicitement si le binding comporte des erreurs.
private void btnValider_Click(object sender, RoutedEventArgs e)
{
var expressionLiaison = txtNom.GetBindingExpression(TextBox.TextProperty);
if (expressionLiaison != null && expressionLiaison.HasError)
{
MessageBox.Show($"Erreur : {expressionLiaison.ValidationError.ErrorContent}");
return;
}
// Procéder à la soumission
}
Une pratique utile est de forcer une première évaluation des bindings au chargement de la fenêtre, par exemple en appelant txtNom.GetBindingExpression(TextBox.TextProperty).UpdateSource() dans le gestionnaire de l'événement Loaded, pour s'assurer que les validations sont immédiatement actives.