[WPF] Valider les binding WPF
Lorsque l’on travaille avec WPF et que l’on manipule des objets complexes, il est très agréable d’utiliser le binding, sur l’interface utilisateur, pour afficher les informations concernant les objets métier.
Bien que le moteur WPF permette d’afficher, grâce aux templates, une interface différente si une erreur est détectée, il reste tout de même à la charge du développeur d’effectuer le test permettant de savoir si, sur un contrôle précis, une règle de validation est violée ou non.
Afin de vous simplifier la vie, vous pouvez utiliser la méthode suivante, qui se charge de valider toutes les règles de binding présentes sur un Dependency Object et sur ces enfants:
public static class Validator
{
public static bool IsValid(DependencyObject parent)
{
// Validate all the bindings on the parent
var valid = true;
var localValues = parent.GetLocalValueEnumerator();
while (localValues.MoveNext())
{
var entry = localValues.Current;
if (BindingOperations.IsDataBound(parent, entry.Property))
{
var binding = BindingOperations.GetBinding(parent, entry.Property);
if (binding != null)
{
foreach (var rule in binding.ValidationRules)
{
var result = rule.Validate(parent.GetValue(entry.Property), null);
if (!result.IsValid)
{
var expression = BindingOperations.GetBindingExpression(parent, entry.Property);
if (expression != null)
{
Validation.MarkInvalid(expression, new ValidationError(rule, expression, result.ErrorContent, null));
}
valid = false;
}
}
}
}
}
// Validate all the bindings on the children
for (var i = 0; i != VisualTreeHelper.GetChildrenCount(parent); ++i)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (!IsValid(child))
{
valid = false;
}
}
return valid;
}
}
Pour utiliser cette méthode, rien de plus simple:
var isValid = Validator.IsValid(this.tbClassName);
if (isValid)
{
//
}
Attention, je tiens à préciser que cette méthode n’est pas de moi mais qu’elle est disponible dans le livre “Programming WPF” de Chris Sell & Ian Griffiths 
A+
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :