Comment forcer la mise à jour des erreurs de validation sur View from ViewModel à l'aide de IDataErrorInfo?
J'ai un MVVM Fenêtre avec de nombreux contrôles, et mon Modèle implémente IDataErrorInfo
.
Il y a aussi un SaveCommand
bouton, qui effectue une validation par l'analyse Model.Error
de la propriété.
La vue affiche la valeur par défaut bordure rouge autour des commandes avec des erreurs seulement lorsque je change la valeur d'un contrôle particulier, ou lorsque je m'adresser pour signaler le changement de la propriété à l'aide de PropertyChanged.
Comment puis-je la force pour afficher toutes les erreurs de Validation, même quand je ne touche pas les contrôles?
Tous mes validation des liaisons comprennent ValidatesOnDataErrors=True, NotifyOnValidationError=True
.
Je sais que la seule solution est d'avoir un total de boîte avec toutes les erreurs, mais je préfère l'affichage des erreurs par-contrôle de la base.
Je ne veux pas déclencher Model.NotifyPropertyChanged
pour chaque liés à la propriété du ViewModel.
- Je utiliser WPF 4.0, pas de Silverlight, donc INotifyDataErrorInfo
ne fonctionne pas.
source d'informationauteur surfen
Vous devez vous connecter pour publier un commentaire.
Vous mentionner que vous n'avez pas envie de relancer bien changé pour les propriétés de vous lier, mais c'est vraiment la façon la plus simple pour effectuer cette opération. L'appel de PropertyChanged avec aucun paramètre ne soulèvera pour toutes les propriétés de votre viewmodel.
Alternativement, vous pouvez mettre à jour les liaisons (et de la force de revalidation) sur l'une des commandes comme ceci:
La meilleure solution que j'ai trouvé jusqu'à présent que des œuvres est de changer DataContext à null et à l'instance de ViewModel.
Ce qui déclenche la mise à jour pour les contrôles de la vue qui a
DataContext
lié àInnerViewModel
:Il est recommandé de vérifier si aucune donnée n'est perdue après cette astuce. J'ai eu un cas de ce code déclenché source de mise à jour de zone de liste déroulante.SelectedItem avec nul mais j'ai réussi à le résoudre. Il a été causé par l'utilisation d'une ressource basée sur BindingProxy et de l'ordre de
DataContext=null
propagation à travers le contrôle de la hiérarchie.Ce "Hack" a fonctionné pour moi temporairement, à force de le InotifyChanged événement, il suffit de céder qui contrôle son propre contenu. Faire cela avant d'évaluer le HasError fonction de liaisons. Par exemple une zone de texte serait:
Et puis un exemple complet(avant que j'entende ce n'est pas vrai MVVM, j'ai directement eu une poignée sur la grille pour la facilité de montrer ce code snipet)