2012-02-14 17 views
18

Dlaczego następujący fragment XAML daje mi wyjątek XamlParseException z (bez znaczenia) wiadomością "Typ wyrażenia nie jest prawidłową wartością stylu". W czasie wykonywania?Korzystanie z TemplateBinding w 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> 

Linia wykraczająca jest

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

Gdybym wymienić TemplateBinding z normalnym Oprawa zacznie działać:

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

Jeżeli nie będę mógł użyć TemplateBinding od Jestem w ControlTemplate? A co tak naprawdę oznacza komunikat o wyjątku?

+0

Po prostu pomyślałem, że będę chip, że mam podobny problem, Całkowicie zapomniałem o możliwości użycia zwykłego wiązania, dzięki za pracę. – Hugoagogo

Odpowiedz

0

Wyzwalacze działają najlepiej, gdy są zdefiniowane w samodzielnych stylach, a nie w miejscu. Spróbuj zdefiniować wyzwalacz w zasobach stylu, a następnie odwołaj się do zasobu stylu z szablonu.

+0

Przepraszam, nie odpowiada na moje pytanie. wiem, jak obejść problem, ale chciałbym wiedzieć, dlaczego tak się dzieje. – stmax

2

Wiązanie TemplatedParent: W tym wierszu wartość ścieżki2 zostanie zastosowana dla właściwości Text obiektu TextBlock, więc działa poprawnie.

W TemplateBinding: Czy z bliska przyjrzeć się tym, rozwiązany wartość Max: MyControl.Bar będzie działać jako podstawowy zasób dla szablonu wiążące [Tutaj wartość Bar nie jest to faktyczna wartość, zamiast jest to nazwa klucza własności], która nie istnieje i dlatego generuje błąd "Podany klucz nie był obecny w słowniku."