Je suis assez nouveau pour WPF. Dans notre projet actuel, nous avons ajouté des règles de validation pour tous les champs de saisie de données dont nous avons besoin de validation. Nous avons également copié du code (également affiché ici sur stackoverflow) qui boucle récursivement sur toutes les liaisons et leurs règles de validation, afin de savoir si toutes les données sont valides ou non avant d'enregistrer les données.Comment puis-je ignorer la validation des éléments désactivés?
C'est notre code que je pense est l'endroit idéal pour résoudre notre problème:
Public Function ValidateBindings(ByVal parent As DependencyObject) As Boolean
Dim valid As Boolean = True
Dim localValues As LocalValueEnumerator = parent.GetLocalValueEnumerator
While localValues.MoveNext
Dim entry As LocalValueEntry = localValues.Current
If BindingOperations.IsDataBound(parent, entry.Property) Then
Dim binding As Binding = BindingOperations.GetBinding(parent, entry.Property)
For Each rule In binding.ValidationRules
Dim result As ValidationResult = rule.Validate(parent.GetValue(entry.Property), Nothing)
If Not result.IsValid Then
Dim expression As BindingExpression = BindingOperations.GetBindingExpression(parent, entry.Property)
Validation.MarkInvalid(expression, New ValidationError(rule, expression, result.ErrorContent, Nothing))
valid = False
End If
Next
End If
End While
For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(parent) - 1
Dim child As DependencyObject = VisualTreeHelper.GetChild(parent, i)
If Not ValidateBindings(child) Then
valid = False
End If
Next
Return valid
End Function
J'ai essayé de savoir comment utiliser GetValue()
sur la propriété de dépendance IsEnabledProperty
du parent
, mais mes tentatives si loin ont échoué. Quelqu'un peut-il m'aider avec ceci ou ce n'est pas la bonne façon de penser pour résoudre ce problème? Sinon, j'ai joué avec l'idée de lier l'erreur de validation à une règle "ignore n'importe quel contenu" quand le champ est désactivé, mais cela me semble plus difficile.
J'ai essayé de mettre Binding.NotifyOnValidationError
par la liaison en XAML, mais je ne peux pas se lier à la même valeur pour IsEnabled
et NotifyOnValidationError
de l'élément le faire, car il est pas un DependencyProperty.
Une autre chose que j'ai essayé était d'ajouter une propriété ElementIsEnabled
dans la classe de validation, ne pas être en mesure de faire quelque chose comme ça en XAML:
<Binding.ValidationRules>
<local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" />
</Binding.ValidationRules>
Mais cela échoue aussi depuis ElementIsEnabled
n'est pas un DependencyProperty sur un DependencyObject .
De toute façon, toute aide à ce sujet serait grandement appréciée.