Dans WPF, vous pouvez configurer la validation en fonction des erreurs générées dans votre couche de données lors de la liaison de données à l'aide de ExceptionValidationRule
ou DataErrorValidationRule
.
Supposons que vous ayez un tas de contrôles configurés de cette façon et que vous ayez un bouton Enregistrer. Lorsque l'utilisateur clique sur le bouton Enregistrer, vous devez vous assurer qu'il n'y a pas d'erreurs de validation avant de procéder à l'enregistrement. S'il y a des erreurs de validation, vous voulez les crier dessus.
Dans WPF, comment savoir si des erreurs de validation sont définies dans l'un de vos contrôles liés aux données?
la source
IsValid
fonction? Je vois que vous avez configuré unCanExecute
qui, je suppose, est lié à la commande du bouton Enregistrer. Cela fonctionnera-t-il si je n'utilise pas de commandes? Et comment le bouton est-il lié aux autres commandes qui doivent être vérifiées? Ma seule réflexion sur la façon de l'utiliser est d'appelerIsValid
chaque contrôle qui doit être validé. Edit: Il semble que vous validezsender
ce que j'espère être le bouton de sauvegarde. Cela ne me semble pas correct.Window
est également un objet de dépendance. I il est probablement en train de le configurer avec une sorte de gestionnaire d'événements sur leWindow
. Vous pouvez également l'appeler directementIsValid(this)
depuis laWindow
classe.Le code suivant (tiré du livre Programming WPF de Chris Sell & Ian Griffiths) valide toutes les règles de liaison sur un objet de dépendance et ses enfants:
Vous pouvez appeler cela dans votre gestionnaire d'événement de clic de bouton d'enregistrement comme ceci dans votre page / fenêtre
la source
Le code affiché ne fonctionnait pas pour moi lors de l'utilisation d'une ListBox. Je l'ai réécrit et maintenant ça marche:
la source
Eu le même problème et essayé les solutions fournies. Une combinaison des solutions H-Man2 et skiba_k a fonctionné presque bien pour moi, à une exception près: Ma fenêtre a un TabControl. Et les règles de validation ne sont évaluées que pour le TabItem actuellement visible. J'ai donc remplacé VisualTreeHelper par LogicalTreeHelper. Maintenant ça marche.
la source
En plus de la grande implémentation LINQ de Dean, je me suis amusé à envelopper le code dans une extension pour DependencyObjects:
Cela le rend extrêmement agréable compte tenu de la réutilisation.
la source
Je proposerais une petite optimisation.
Si vous faites cela plusieurs fois sur les mêmes contrôles, vous pouvez ajouter le code ci-dessus pour conserver une liste de contrôles qui ont en fait des règles de validation. Ensuite, chaque fois que vous avez besoin de vérifier la validité, passez uniquement en revue ces contrôles, au lieu de l'ensemble de l'arborescence visuelle. Cela s'avérerait beaucoup mieux si vous disposiez de nombreux contrôles de ce type.
la source
Voici une bibliothèque pour la validation de formulaire dans WPF. Paquet Nuget ici .
Échantillon:
L'idée est que nous définissons une portée de validation via la propriété attachée en lui indiquant les contrôles d'entrée à suivre. Ensuite, nous pouvons faire:
la source
Vous pouvez parcourir toutes vos arborescences de contrôles de manière récursive et vérifier la propriété attachée Validation.HasErrorProperty, puis vous concentrer sur la première que vous y trouvez.
vous pouvez également utiliser de nombreuses solutions déjà écrites, vous pouvez consulter ce fil pour un exemple et plus d'informations
la source
Vous pourriez être intéressé par l' exemple d'application BookLibrary de WPF Application Framework (WAF) . Il montre comment utiliser la validation dans WPF et comment contrôler le bouton Enregistrer en cas d'erreurs de validation.
la source
Dans la forme de réponse aogan, au lieu d'itérer explicitement à travers les règles de validation, mieux vaut simplement invoquer
expression.UpdateSource():
la source