2010-11-12 20 views
13

¿Por qué no hay texto de información sobre herramientas en los errores?Errores de validación de WPF: configuración de información sobre herramientas con el mensaje de error

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <StackPanel> 
        <Border ...> 
         <AdornedElementPlaceholder ... 
          ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
        </Border> 
        ... 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

También he notado que

<AdornedElementPlaceholder ... 
    ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 

falla pero los suceeds abajo, incluso con la misma unión, ¿por qué es esto así? ¿No se refiere AdornedElementPlaceholder al cuadro de texto? Incluso si no lo hace, ¿no debería aparecer una información sobre herramientas en algún lugar?

<Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
    </Trigger> 
</Style.Triggers> 

Respuesta

4

No se puede colocar un texto de ayuda en la AdornedElementPlaceholder, no creo que es visible en absoluto, es sólo la reserva de espacio para quien lo usa (en su caso, un cuadro de texto). Si miramos el árbol visual con Snoop podemos ver que TemplatedAdorner termina en un lugar diferente en el VisualTree que en el TextBox, por lo que ahora podremos encontrar el TextBox desde VisualTree. Podemos encontrarlo a través de AdornedElement, pero aún no podremos establecer una información sobre herramientas.

alt text

El único visible aquí en la TemplatedAdorner es la frontera. The Border conoce a su hijo, el TemplatedAdorner, que a su vez conoce su AdornedElement, el TextBox. Entonces podemos establecer la información sobre herramientas para el borde con esto. (Sin embargo, esta unión parece fallar para actualizar la información sobre herramientas del Borde. Funciona cuando lo miro con Snoop y después de que se muestre.)

<Border BorderBrush="Red" 
     BorderThickness="4" 
     ToolTip="{Binding RelativeSource={RelativeSource self}, 
        Path=Child.AdornedElement.(Validation.Errors)[0].ErrorContent}"> 

Por lo tanto, el cuadro de texto tiene su AttachedProperty Validación en lo que podamos encuentre el contenido de error por lo que debe establecer su propia información de la herramienta como lo hizo en su último ejemplo; de lo contrario, no funcionará.

+2

solución está muy bien, pero para evitar excepciones en la ventana de Output.Debug que haría que su información sobre herramientas vinculante sobre herramientas = "{Binding RelativeSource = {self} RelativeSource, Path = Child.AdornedElement. (Validation.Errors) .CurrentItem.ErrorContent} " – Dude0001

17

Sé que llego tarde, pero permítanme compartir una solución que encontré estudiando esta pregunta: WPF custom validator with tooltip.

En su forma más simple este ErrorTemplate muestra solamente una Tooltip con el ErrorContent para toda la AdornedElement.

<ControlTemplate x:Key="validationTemplate"> 
    <Grid Background="Transparent" 
      ToolTip="{Binding Path=/ErrorContent}"> 
     <AdornedElementPlaceholder /> 
    </Grid> 
</ControlTemplate> 

Pero, por supuesto, puede decorarlo como desee, p. con un Tooltip por solo un marcador.

<ControlTemplate x:Key="validationTemplate"> 
    <Grid> 
     <Ellipse Fill="Red" Opacity="0.8" Width="10" Height="10" 
       HorizontalAlignment="Right" VerticalAlignment="Top" 
       ToolTip="{Binding Path=/ErrorContent}" /> 
     <AdornedElementPlaceholder /> 
    </Grid> 
</ControlTemplate> 

poner esto en TemplateResources y todo lo que tiene que hacer es fijar el Validation.ErrorTemplate.

Validation.ErrorTemplate="{StaticResource validationTemplate}" 

Incluso este disparador Trigger ya no es necesario.

<Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
    </Trigger> 
</Style.Triggers> 
+1

Esa es una buena idea; desafortunadamente, su primera solución colocará una superposición (transparente) sobre todo el cuadro de texto, evitando que el usuario lo enfoque y corrija el error. – poke

+0

@poke Tienes razón. La primera solución solo es útil para los controles que muestran un error. Pero tal vez la segunda solución sea de todos modos lo que quieras. – LPL

+0

La segunda solución funciona bien para un TextBox, pero no para un ComboBox. No puedo hacer clic en ComboBox en absoluto si tengo IsHitTestVisible configurado en verdadero, lo que parece ser necesario para que la información sobre herramientas funcione. ¿Alguna idea? –

Cuestiones relacionadas