wpf xaml adornerlayer

wpf - Validación de la plantilla de error no se muestra en los errores de datos



xaml adornerlayer (1)

¡Esto es un poco de una novela de WPF! Mis templos de validación no aparecen cuando se espera.

El problema

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

He intentado usar la plantilla de error de borde rojo integrada en el cuadro de texto, 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}"/>

Extrañamente, el error entra en la colección Validation.Errors. Los resultados del código siguiente en mi mensaje de error IDataErrorInfo se muestran 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) devuelve true.

Estoy organizando WPF en winforms si eso marca 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 del estilo.


Lo rajó

La propiedad adjunta ErrorTemplate utiliza la capa adorner para mostrar plantillas de error en fallas de validación de datos reportadas a través de IDataErrorInfo. La capa Adorner no siempre está disponible para todos los controles en todas las situaciones. Su control o uno de sus padres debe proporcionar explícitamente uno.

La plantilla de control de Windows predeterminada contiene un AdornerDecorator que habilita la capa de adorno para sus hijos. Esta es la razón por la que mi otra ventana mostró 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 un ControlTemplate para mi ventana. Esta plantilla de control no proporcionó un <AdornerDecorator> , por lo tanto, no hay una capa de adorno para mostrar mi plantilla de error.

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