2010-08-03 3 views
0
  • Dans mon scénario, j'ai un backend Data Linq2SQL.
  • mes DataObjects mettre en œuvre IDataErrorInfo pour attraper des erreurs comme Name==null (rapide pour exécuter ValidationRules qui nécessitent seulement la valeur, rien de spécial à ce jour)WPF long scénario de validation

  • les DataObjects sont organisés dans une structure arborescente, donc chacun a un parent et Enfants

Comment puis-je valider si un nom choisi est unique sous les enfants d'un parent de Dataobjects? Le problème auquel je suis confronté est, que la validation de nom unique nécessite une interruption de base de données qui retarde la saisie si UpdateSourceTrigger="PropertyChanged" sur la liaison TextBox au nom. D'autre part, je pourrais définir UpdateSourceTrigger="LostFocus", mais le problème avec cela, c'est que j'activer/désactiver un bouton "Enregistrer" sur les données valides/invalides. Maintenant, dans l'état invalide, vous ne pouvez pas cliquer sur le bouton Enregistrer, le Textbox ne peut donc pas perdre la mise à jour de Focus (seulement tabulation qui est moche, mais il y a plus d'inhabilités avec LostFocus (par exemple Error continue à afficher changeant ainsi le nom)

ce qui serait idéal était une façon de dire pour ValidationRules individuels à appliquer sur les différents événements comme ceci:.

<TextBox Grid.Column="1"> 
    <TextBox.Text> 
     <Binding Path="Foldername"> 
      <Binding.ValidationRules> 
       <wpfresources:UniqueChildValidationRule ValidationStep="UpdatedValue" **UpdateSourceTrigger="LostFocus"**> 
        ... stuff here ... 
       </wpfresources:UniqueChildValidationRule> 
       <DataErrorValidationRule **UpdateSourceTrigger="PropertyChanged"**/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

Quelle est la meilleure façon de résoudre ce

? EDIT

This MSDN article semble suggérer qu'un BindingGroup serait le chemin à parcourir. Je vais regarder dans ce ...

Répondre

1

J'ai finalement trouvé un moyen d'accomplir ce que je voulais. L'utilisation de BindingGroup a fonctionné, mais j'ai dépouillé ma solution car ce dont j'avais essentiellement besoin était de montrer un Validationerror dans la bonne Textbox.

Je l'ai fait maintenant avec une propriété jointe que j'ai lue lors de l'exécution de la fonction "save". Ensuite, je valide manuellement et définissez un ValidationError sur la zone de texte. De cette façon, la zone de texte peut conserver sa propriété PropertyChanged UpdateSourceTrigger et la validation longue est effectuée sur submit.

0

Pour ce que ça vaut, la validation qui nécessite un temps potentiellement arbitraire (parler à une base de données sur un réseau, par exemple) est une forme de validation qui n'a pas besoin d'être reflétée dans l'interface utilisateur en temps réel. Si vous pouvez le faire de sorte qu'il soit (pré-cache les valeurs qui seront vérifiées en les lisant de la base de données avant que vous ayez besoin d'eux, par exemple), tant mieux, mais c'est le scénario où signaler une erreur après le l'utilisateur a soumis les données est généralement acceptable tant que vous ne détruisez pas les informations que l'utilisateur a saisies.

+0

merci pour votre réponse greg. Signaler l'erreur après que l'utilisateur a soumis les données faisait partie de mon problème. Une règle de validation n'a manifestement pas fonctionné et a entravé d'autres règles de validation. J'ai trouvé une solution maintenant qui fonctionne pour moi que j'ai posté. –