2010-09-09 18 views
18

Esto es un poco de una novela policíaca WPF! Sienes de validación no aparece cuando se espera
Validación ErrorTemplate no aparece en los errores de datos

El problema

Básicamente, estoy usando IDataErrorInfo en mi modelo de vista para proporcionar información sobre los errores de entrada de datos. Puedo ver cómo se llama y funciona como se esperaba, ¡pero WPF nunca muestra la plantilla de error de validación para el control vinculado!

He intentado utilizar la plantilla de error de borde rojo de la caja de texto predeterminada incorporada, una plantilla de error de estilo y una plantilla codificada. Ninguno de estos se muestra en una situación de error de datos.

Heres mi código de enlace xaml:

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

wierdly, el error entre en la colección Validation.Errors. El siguiente código da como resultado que el mensaje de error IDataErrorInfo se muestre junto al control enlazado. Esto me lleva a pensar que el problema está en el lado xaml, más bien en el lado del modelo de vista.

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

Además, System.Windows.Controls.Validation.GetHasError(txtCaseNumber) vuelve verdadera.

Estoy de alojamiento en WPF WinForms si eso hace la diferencia. No puedo encontrar ninguna referencia en mi código o estilos a Validation o ErrorTemplate, así que estoy bastante seguro de que este no es un objetivo propio de diseño.

Respuesta

41

agrietado.

La propiedad adjunta ErrorTemplate uses the adorner layer para mostrar las plantillas de error en las fallas de validación de datos informadas a través de IDataErrorInfo. La capa de Adorner es not always available para todos los controles en todas las situaciones. Su control o uno de sus padres debe proporcionarlo explícitamente.

la plantilla de control de ventanas por defecto contiene un AdornerDecorator que permite que la capa adorner por sus hijos. Esta es la razón por la que mi otra ventana mostraba mis plantillas de error muy bien, porque esta ventana usaba la plantilla de control predeterminada

La ventana que no mostraba mi plantilla de error había usado un estilo que proporcionaba una plantilla ControlTemplate para mi ventana. Esta plantilla de control no proporcionó un <AdornerDecorator>, por lo tanto, no hay una capa adorno para mostrar mi plantilla de error.

La solución fue tan simple como envolver mi plantilla de control de ventana con <AdornerDecorator>.

+5

¡Te pido mi sombrero, señor! Tenía un UserControl> Expander> Textbox en una extensión de VS. Pero no mostraría los errores IDataErrorInfo. Hizo una aplicación WPF de muestra para alojar el UC - problema persistido (VS Extn descartado). Hizo otra VM, eso funcionó descartando la VM. Luego llegué a su publicación: agregué un par de controladores de eventos cargados a la ventana y al UC. Efectivamente, UC devolvió una AdornerLayer nula. Envolvió el contenido del expansor con AdornerDecorator y funcionó. Me retrasó 2 días ... vivir n aprender, supongo. Una vez más, ¡gracias por la persistencia y el tiempo para documentarlo para la posteridad! – Gishu

+0

sin problemas! Perdí 2 días en él también :( –

+1

Esto simplemente solucionó mi problema con una ventana de estilo Metro que no proporcionaba un AdornerDecorator. ¡Gracias! – mortware

Cuestiones relacionadas