2009-12-14 9 views
3

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.

Répondre

5

Dans .NET 4 vous pourriez maintenant obtenir une référence à votre élément à l'intérieur du ValidationRule via x:Reference:

public class MustContainInteger : ValidationRule 
{ 
    public UIElement Element { get; set; } 

    // ... 
} 
<TextBox Name="testtb"> 
    <TextBox.Resources> 
     <!-- Definition in resources necessary because of cyclical dependency --> 
     <vr:MustContainInteger x:Key="Rule" Element="{x:Reference testtb}" /> 
    </TextBox.Resources> 
    <TextBox.Text> 
     <Binding Path="TestString"> 
      <Binding.ValidationRules> 
       <StaticResource ResourceKey="Rule" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

Bien sûr, vous permet de vérifier Element.IsEnabled dans Validate.

Questions connexes