2012-02-14 9 views
18

Perché il seguente pezzo di XAML mi fornisce XamlParseException con il messaggio (senza significato) "Il tipo di espressione non è un valore di stile valido". in fase di esecuzione?Utilizzo di TemplateBinding in 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 linea incriminata è

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

Se si sostituisce la TemplateBinding con un normale Binding comincia a lavorare:

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

Non dovrei essere in grado di utilizzare un TemplateBinding dal Sono all'interno di un ControlTemplate? E cosa significa veramente il messaggio di eccezione?

+0

Ho solo pensato di farmi sapere che sto avendo un problema simile, completamente dimenticato di poter usare una rilegatura regolare, grazie per il lavoro svolto. – Hugoagogo

risposta

0

I trigger funzionano al meglio se definiti in stili standalone, non in contenuto in-place. Prova a definire il trigger in una risorsa di stile, quindi fai riferimento alla risorsa di stile dal modello.

+0

scusa, non risponde alla mia domanda. so come risolvere il problema, ma vorrei sapere perché succede. – stmax

2

Binding TemplatedParent: in questa riga il valore del path2 si applicherà alla proprietà Text di TextBlock, quindi funziona correttamente.

In TemplateBinding: dai un'occhiata a questo, Il valore risolto di Max: MyControl.Bar sta per agire come chiave di risorsa per il collegamento Template [Qui il valore di Bar non è un valore effettivo, è un nome di chiave di proprietà] che non esiste e quindi genera l'errore "La chiave data non era presente nel dizionario."