2009-10-20 5 views
7

J'ai une zone de saisie de texte défini comme ceci:changement Programmatically règle de validation dans WPF TextBox

<TextBox> 
     <TextBox.Text> 
      <Binding Path="MyProperty"> 
       <Binding.ValidationRules> 
        <valid:MyValidator/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 

Mon problème est que, selon un autre paramètre, ce qui est censé être inséré varie ici. Et ainsi, le comportement de validation des données d'entrée devrait changer. Comment puis-je dans le code derrière changer la règle de validation active pour une certaine zone de texte?

+0

avec un convertisseur? – Natrium

+0

Je pensais que les convertisseurs étaient plus destinés à changer (convertir) les données entrantes? Je veux remplacer complètement la règle de validation active, sans changer l'entrée donnée par l'utilisateur. – Mizipzor

Répondre

19

Utilisez BindingOperations.GetBinding() pour obtenir l'objet Binding pour TextBox.Text. Ensuite, manipulez la collection ValidationRules de la liaison comme bon vous semble.

Binding binding = BindingOperations.GetBinding(myTextBox, TextBox.TextProperty); 
binding.ValidationRules.Clear(); 
binding.ValidationRules.Add(myCrazyValidationRule); 
+0

Cela semble être exactement ce que je veux, je l'essaie et je reviens pour accepter votre réponse. :) – Mizipzor

+2

@itowlson Eh bien, avez-vous une idée de faire cela en XAML en suivant le modèle MVVM? – RobinAtTech

+0

J'ai aimé cette touche humoristique "myCrazyValidationRule" – Tarik

1

La solution la plus hacky qui vient à l'esprit est de définir une zone de texte pour chacune des règles de validation qui devraient pouvoir être réglés. Liez une zone de texte à chacune des règles de validation. Puis, en fonction du paramètre/de la condition externe, réduisez/masquez toutes les zones de texte sauf celle avec la règle de validation qui doit être appliquée.

+0

Ceci est une excellente solution, btw avez-vous une idée d'utiliser la réponse itowlson dans le modèle MVVM? – RobinAtTech

Questions connexes