Montrer WPF message d'erreur de validation dans un lieu fixe
J'ai eu WPF validation en cours d'exécution (ajouté ValidationRules
de la liaison) et avec le modèle je peux créer des beaux ornements. Il y a beaucoup de détachement.
Mais je ne peux pas trouver un moyen d'afficher le message d'erreur à l'extérieur de la ornés de contrôle dans un lieu fixe comme un TextBlock
dans un coin de la fenêtre par exemple
Comment pourrais-je y parvenir? Puis-je lier tous mes messages d'erreur de validation pour mon DataContext
(ViewModel ici)?
Mise à jour: Merci pour la réponse, je suis partie au travail. La validation des messages sont maintenant affichés dans une autre étiquette. Comme toutes les zones de texte avec leurs règles de validation sont créées à la volée par le code, les contraignant à faire est fait de cette façon:
Binding bindSite = new Binding();
bindSite.Source = this.validationErrorDisplayLabel;
BindingOperations.SetBinding(textBox, Validation.ValidationAdornerSiteProperty, bindSite);
Mais les messages de validation sont uniquement transmises à la adornersite
pour la dernière zone de texte pour lequel ce code a été exécuté.
J'ai reproduit le problème dans ce petit exemple.
XAML:
<Grid>
<TextBox
Validation.ValidationAdornerSite="{Binding ElementName=ErrorDisplay}"
HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding>
<Binding.Path>Box1</Binding.Path>
<Binding.ValidationRules>
<local:RuleA />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBox
Validation.ValidationAdornerSite="{Binding ElementName=ErrorDisplay}"
HorizontalAlignment="Left" Height="23" Margin="10,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding>
<Binding.Path>Box2</Binding.Path>
<Binding.ValidationRules>
<local:RuleA />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock
x:Name="ErrorDisplay"
Background="AntiqueWhite"
Foreground="Red"
Text="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.ValidationAdornerSiteFor).(Validation.Errors)[0].ErrorContent}"
HorizontalAlignment="Left" Margin="230,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" RenderTransformOrigin="2.218,-4.577" Width="177" Height="51"/>
</Grid>
La classe RuleA
produit une erreur de validation lorsque la valeur est égale à la chaîne de "A"
. Les erreurs dans la 2ème zone de texte sont affichés dans le TextBlock, les erreurs du premier pas (elle utilise le modèle par défaut et obtient une bordure rouge).
Comment peut-il travailler pour les deux? Le textblock n'a pas besoin de la somme de toutes les erreurs, mais l'affichage de la première erreur.
OriginalL'auteur ZoolWay | 2014-11-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un
BindingGroup
en combinaison avec laValidation.ValidationAdornerSite
etValidation.ValidationAdornerSiteFor
propriétés.Ce blog vous montre un exemple de comment faire cela.
De commettre les valeurs que l'utilisateur tape, changer la
UpdateSourceTrigger
valeurs dePropertyChanged
. Notez qu'il n'est pas strictement nécessaire à l'utilisationValidationAdornerSite
ici; vous pouvez simplement pointer leErrorDisplay
liant directement à la propriétaire de laBindingGroup
:Validation.ValidationAdornerSite
etValidation.ValidationAdornerSiteFor
j'ai eu le résultat de validation à un autre contrôle. Mais seulement un travailleur pour les erreurs dans la dernière zone de texte attribué une..AdornerSite
.J'ai reçu cette réponse car elle m'a aidé à bien que ma solution se trouve dans une autre direction. Merci. Voir accepté de répondre pour ce qui était ma dernière solution.
Merci, content d'avoir pu aider!
OriginalL'auteur Mike Strobel
Grâce à http://www.scottlogic.com/blog/2008/11/28/using-bindinggroups-for-greater-control-over-input-validation.html j'ai été en mesure de résoudre ce avec un BindingGroup et sans ValidationAdornerSite.
La validation se produit uniquement lorsque vous appelez
CommitEdit
. Si vous voulez l'avoir tout de suite comme j'ai voulu, ici, vous pouvez utiliserLostFocus
Bien sûr, pour un plus grand projet d'une propriété attachée pourrait aider.
OriginalL'auteur ZoolWay