Bonjour!

Je souhaite mettre en place une validation des données en WPF lorsque l'utilisateur clique sur un bouton "Valider".

J'ai actuellement un BindingGroup dans un StackPanel pour gérer l'annulation des changements de l'utilisateur grâce aux méthodes CommitEdit() et CancelEdit() qui fonctionnent très bien!

J'ai vu que l'on doit créer des ValidationRules pour ajouter une couche de validation.

Mon problème est que quand je lance CommitEdit(), il valide les données dans ma source et seulement ensuite il vérifie la ValidationRule... Et donc même si les données ne sont pas correctes, mon objet est mis à jour avec de mauvaises données...

J'ai donc essayé de changer ValidationStep mais soit cela ne change rien ou lors de la vérification de ValidationRule, la nouvelle valeur de ATT_LIBELLE n'est pas affectée, elle reste sur l'ancienne valeur avant la validation... Donc pas vraiment possible de vérifier quoique ce soit!

Comment faire pour valider les nouvelles valeurs dans la ValidationRule et que CommitEdit() fasse un commit seulement qu'une fois que tout est ok ?

Merci.

BindingGroup :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<StackPanel x:Name="spObjet" Grid.Row="1" DataContext="{Binding oObjetEdit}">
    <StackPanel.BindingGroup>
        <BindingGroup>
            <BindingGroup.ValidationRules>
                <local:ObjetValidationRule ValidationStep="CommittedValue" />
            </BindingGroup.ValidationRules>
        </BindingGroup>
    </StackPanel.BindingGroup>
 
    <TextBox x:Name="txtLibelle" Text="{Binding ATT_LIBELLE}" />
    ...
</StackPanel>
ValidationRule :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public class ObjetValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var bindingGroup    = (value as BindingGroup);
        var oObjet          = (bindingGroup.Items[0] as Attribut);
 
 
        if (string.IsNullOrEmpty(oObjet.ATT_LIBELLE))
        {
            return new ValidationResult(false, "Vous devez renseigner un libellé");
        }
 
        return ValidationResult.ValidResult;
    }
}