2010-09-09 3 views
18

Ceci est un peu un polar WPF! Mes temples de validation, il ne figurant pas au moment prévu
Validation ErrorTemplate ne s'affiche pas sur les erreurs de données

Le problème

En fait, je me sers IDataErrorInfo sur mon modèle en vue de formuler des commentaires sur les erreurs de saisie de données. Je peux voir que cela est appelé et fonctionne comme prévu, mais le modèle d'erreur de validation pour le contrôle lié n'est jamais affiché par WPF!

J'ai essayé les deux en utilisant le modèle intégré d'erreur de bordure rouge de la zone de texte par défaut, un modèle d'erreur de style et un modèle codé en dur. Aucun d'entre eux n'est affiché dans une situation d'erreur de données.

Heres mon code de liaison XAML:

<TextBox x:Name="txtCaseNumber" 
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/> 

wierdly, l'erreur obtient dans la collection Validation.Errors. Le code suivant entraîne l'affichage de mon message d'erreur IDataErrorInfo à côté du contrôle lié. Cela m'amène à penser que le problème est du côté de xaml, plutôt du côté de viewmodel.

<ContentPresenter 
Content="{Binding ElementName=txtCaseNumber, Path=(Validation.Errors).CurrentItem}" /> 

De plus, System.Windows.Controls.Validation.GetHasError(txtCaseNumber) renvoie true. J'héberge WPF en winforms si cela fait une différence. Je ne trouve aucune référence dans mon code ou mes styles à Validation ou ErrorTemplate, donc je suis à peu près sûr que ce n'est pas un but propre.

Répondre

41

Fissuré.

La propriété jointe ErrorTemplate uses the adorner layer affiche des modèles d'erreur sur les échecs de validation de données signalés via IDataErrorInfo. La couche Adorner est not always available pour toutes les commandes dans toutes les situations. Votre contrôle ou l'un de ses parents doit en fournir explicitement un.

Le modèle de contrôle Window par défaut contient un AdornerDecorator qui active la couche adorner pour ses enfants. C'est pourquoi mon autre fenêtre montrait bien mes modèles d'erreur, car cette fenêtre utilisait le modèle de contrôle par défaut

La fenêtre qui n'affichait pas mon modèle d'erreur avait utilisé un style qui fournissait un ControlTemplate pour ma fenêtre. Ce modèle de contrôle n'a pas fourni de <AdornerDecorator>, donc pas de couche d'adorer pour afficher mon modèle d'erreur. Le correctif était aussi simple qu'emballer mon modèle de contrôle de fenêtre avec <AdornerDecorator>.

+5

Je vous donne mon chapeau, monsieur! J'ai eu un UserControl> Expander> Textbox dans une extension VS. Mais cela ne montrerait pas les erreurs IDataErrorInfo. Fait un exemple d'application WPF pour héberger l'UC - problème persistant (VS Extn exclu). Fait une autre VM - qui a fonctionné exclu la VM. Ensuite, j'ai frappé votre poste - ajouté un couple de gestionnaires d'événements Loaded à la fenêtre et l'UC. Effectivement, UC a renvoyé un AdornerLayer nul. Enveloppé le contenu de l'expander avec AdornerDecorator et cela a fonctionné! Je me suis ralentie de 2 jours ... j'apprends n live je suppose. Encore une fois, merci pour la persistance et le temps de le documenter pour la postérité !! – Gishu

+0

pas de problèmes! J'ai perdu 2 jours dessus aussi :( –

+1

Cela vient de corriger mon problème avec une fenêtre de style Metro qui ne fournissait pas un AdornerDecorator. – mortware

Questions connexes