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.
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