2017-04-18 4 views
0

Dans WPF, les implémentations de validation classiques effectuent une validation lorsqu'une valeur de propriété est modifiée. Cela présente un problème. Si vous avez un champ "Obligatoire" et que vous cliquez sur un bouton, l'utilisateur n'est pas averti du vide lorsqu'il clique sur le bouton. Puisque la valeur n'a pas changé, la validation ne se produit pas.Où appeler Required.GetBindingExpression lors de la validation de champs vides pour le bloc de validation de la bibliothèque d'entreprise

Il existe de nombreuses approches à ce en ligne par lequel vous effectuez la validation explicitement dans le code-behind, sur un viewmodel de base, etc. Cependant, je suis intéressé par la solution proposée par Microsoft. Cela s'applique en particulier au bloc Application Validation dans Microsoft Enterprise Library que j'utilise actuellement. Microsoft recommande une meilleure approche de la pratique ici: https://msdn.microsoft.com/en-us/library/ff664451(v=pandp.50).aspx

En particulier, ils déclarent:

Si la valeur de la commande validée qui porte l'attribut de validation requis est vide pour commencer, et reste vide lors de la validation, la source n'est pas mise à jour et la validation n'a pas lieu. Dans ce cas particulier, la propriété ValidateOnTargetUpdate ne fonctionnera pas car la valeur par défaut null de la cible ne changera pas. , Vous pouvez appeler UpdateSource sur la liaison pour forcer la validation à se produire, comme indiqué ici au lieu:

this.Required.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

La règle de validation fonctionne dans l'étape de ConvertedProposedValue, après que la valeur a été convertie, mais avant qu'il ne soit mis en sur la source. Cela signifie que les erreurs de conversion de valeur doivent être détectées par un autre mécanisme. Une approche consiste à activer la propriété ValidatesOnDataErrors sur la liaison validée.

Malheureusement, je ne comprends pas cela. Où puis-je appeler la méthode UpdateSource? À quel objet fait référence this dans l'extrait de Microsoft? Je suppose que je dois faire quelque chose comme intercepter la liaison quelque part, mais je ne suis pas sûr.

+0

Votre classe 'Window' aura cette fonction sans nécessité, donc si vous tapez cela dans votre MainWindow.xaml.cs, elle vous donnera la fonction GetBindingExpression. Ceci est également disponible dans n'importe quel 'Controls'. – XAMlMAX

Répondre

0

Je l'ai compris. Comme indiqué dans la section des commentaires, nous avons accès à GetBindingExpression dans la fenêtre ou les contrôles. Je crois que l'intention de Microsoft est que Required est un exemple de nom d'un contrôle et this fait référence au codebehind de la fenêtre, ou tout autre contrôle comme Window qui a un code-behind. En outre, déclencher un événement PropertyChanged comme suggéré ailleurs pour d'autres constructions de validation (par exemple lorsque les développeurs ont implémenté IDataErrorInfo) ne semble pas avoir le même effet dans le bloc de validation de Microsoft Enterprise Library. La validation ne se produit pas en augmentant simplement un événement PropertyChanged sur le contrôle. Ceci n'est pas spécifique aux champs obligatoires. Au lieu de cela Microsoft suggère d'effectuer UpdateSource sur le contrôle, mais avec référence aux champs obligatoires.

Ici How to invoke UpdateSource for all bindings on the form? est un exemple pour la réalisation d'un UpdateSource sur tous les éléments.