En passant de l'état de WPF ValidationRule pour Afficher le Modèle MVVM
Je suis coincé dans une apparence exigence commune. J'ai un WPF Prisme (pour MVVM) de l'application. Mon modèle implémente l' IDataErrorInfo pour la validation. Le IDataErrorInfo fonctionne très bien pour les non-propriétés numériques. Toutefois, pour les propriétés numériques, si l'utilisateur entre des caractères non valides (qui ne sont pas numériques), les données n'atteint même pas le modèle car wpf ne peut pas convertir en type numérique.
Donc, j'ai dû utiliser WPF ValidationRule de fournir à l'utilisateur des messages non valide pour les entrées numériques. Tous les boutons de la vue sont liés à DelegateCommand de prisme (dans le modèle de vue) et l'activation/désactivation des boutons est fait dans le Modèle de Vue lui-même.
Maintenant, si un wpf ValidationRule échouer pour certains de zone de texte, comment puis-je passer cette information à la Vue du Modèle, de sorte qu'il puisse convenablement de désactiver les boutons dans la vue ?
Vous devez vous connecter pour publier un commentaire.
Nirvan
La façon la plus simple de résoudre ce problème particulier est d'utiliser un numérique zone de texte, qui évite à l'utilisateur d'entrer une valeur non valide (vous pouvez soit le faire par l'intermédiaire d'un Fournisseur Tiers, ou de trouver une solution open source, comme une classe dérivée de zone de texte qui supprime non entrée numérique).
La deuxième façon de gérer cela dans MVVM sans faire le ci-dessus, est de définir un autre champ en vous ViewModel qui est une chaîne, et de lier le champ à votre zone de texte. Ensuite, dans le setter de votre chaîne de champ, vous pouvez définir le nombre Entier, et d'attribuer une valeur à votre champ numérique:
Voici un exemple grossier: (REMARQUE je n'ai pas tester, mais ça devrait vous donner l'idée)
Pour MVVM, je préfère utiliser les Propriétés Attachées à ce type de chose, parce qu'ils sont réutilisables et il maintient les modèles de vue propre.
Afin de se lier à la Validation.HasError bien à votre modèle d'affichage, vous devez créer une propriété attachée qui a un CoerceValueCallback qui synchronise la valeur de votre propriété attachée à la Validation.HasError de propriété sur le contrôle de la validation de la saisie de l'utilisateur sur.
Cette article explique comment utiliser cette technique pour résoudre le problème de la notification de la vue modèle de WPF ValidationRule erreurs. Le code en VB j'ai donc porté sur C# si vous n'êtes pas un VB personne.
La Propriété Attachée
À l'aide de La Propriété Attachée dans le XAML
Maintenant la propriété sur votre modèle de vue sera synchronisé avec la Validation.HasError sur votre zone de texte.
IsDataBound()
retournefalse
). Je peux supprimer la coche pourIsDataBound()
et il fonctionne, mais puis-je prendre le risque d'une fuite de mémoire. Aucune idée de comment obtenir cette approche du travail dans le modèle de données de scénario?Depuis .NET 4.5, ValidationRule a une surcharge de la méthode de validation:
Vous pouvez l'annuler et obtenir le modèle de vue de cette façon:
Validate
méthode est appelée par le virtuel. Le code source est ici: referencesource.microsoft.com/#PresentationFramework/Framework/...Vous devez spécifier custome de contrôle de l'utilisateur en fonction de type de liaison de la propriété.
Par exemple, si votre propriété est de type int, vous devez placer de contrôle qui permettent pas diferent valeur, sauf intenger type.
La logique que vous pouvez mettre dans PreviewTextInput="NumberValidationTextBox".
il suffit d'insérer votre logique ou lieu custome de contrôle et vous avez terminé.
Defently doit mettre en œuvre mvvm validation.
Mettre en œuvre
IDataErrorInfo
dans votre modèle ou votre Viewmodel selon la logique de la propriété de liaison. Vous pouvez mettre en œuvre dans les deux classes.Mettre en œuvre cette trop dans votre base de validation de classe. Ici, la validation déclenche lors de la liaison
IDataErrorInfo
ne fonctionne pas.Ensuite, ajoutez global de la classe
xaml
J'ai le même problème avec vous, mais je résoudre d'une autre manière, j'utilise le Déclenche pour désactiver le bouton lorsque l'entrée n'est pas valide. Pendant ce temps, la zone de texte de liaison doit utiliser
ValidatesOnExceptions=true
Si vous fournir une coutume
ValidationRule
mise en œuvre, vous pouvez stocker la valeur qu'il a reçu, ainsi que le stockage de la dernière conséquence. Pseudo:Quelqu'un a résolu ici (malheureusement son en VB), par la création d'une propriété de dépendance HasError dans la machine virtuelle qui semble être lié à la Validation.HasError. Je ne comprends pas complètement encore mais il peut vous aider à:
http://wpfglue.wordpress.com/2009/12/03/forwarding-the-result-of-wpf-validation-in-mvvm/
J'ai rencontré le même problème et résolu avec un truc.
Voir le convertisseur ci-dessous: