2012-02-14 16 views
18

¿Por qué la siguiente parte de XAML me da una XamlParseException con el mensaje (sin sentido) "El tipo de expresión no es un valor de estilo válido". ¿en tiempo de ejecución?Uso de TemplateBinding en ControlTemplate.Triggers

<Control x:Class="TestApp.Max.MyControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:Max="clr-namespace:TestApp.Max" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
    <Control.Template> 
    <ControlTemplate> 
     <TextBlock Name="txt" Text="{TemplateBinding Max:MyControl.Foo}" /> 
     <ControlTemplate.Triggers> 
     <Trigger Property="Control.IsMouseOver" Value="True"> 
      <Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" /> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Control.Template> 
</Control> 

La línea en cuestión es

<Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" /> 

Si se sustituye la TemplateBinding con una unión normal que empiece a trabajar:

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text2} 

¿No debería ser capaz de utilizar un TemplateBinding desde Estoy dentro de una ControlTemplate? ¿Y qué significa realmente el mensaje de excepción?

+0

Solo pensé que iba a decir que tengo un problema similar, olvidé por completo el uso de una encuadernación normal, gracias por el trabajo. – Hugoagogo

Respuesta

0

Los disparadores funcionan mejor cuando se definen en estilos independientes, no en contenido in situ. Intente definir su activador en un recurso de estilo, luego haga referencia al recurso de estilo de su plantilla.

+0

lo siento, no responde mi pregunta. Sé cómo solucionar el problema, pero me gustaría saber por qué sucede. – stmax

2

Encuadernación TemplatedParent: en esta línea, el valor de la ruta2 se aplicará a la propiedad Text del TextBlock, por lo que funciona correctamente.

En TemplateBinding: Mire de cerca esto, El valor resuelto de Max: MyControl.Bar va a actuar como la clave de recurso para la plantilla vinculante [Aquí el valor de Bar no es un valor real, en su lugar es un nombre de clave de propiedad] que no existe y arroja el error "La clave dada no estaba presente en el diccionario".

Cuestiones relacionadas