Betrachten Sie diese (edited-down) Style
, entworfen für eine Button
deren Content
ist ein String
:TemplatedParent ist null, wenn sie innerhalb eines Datatrigger des Control verwendet
<Style x:Key="Test" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<StackPanel>
<TextBlock x:Name="text" Text="{TemplateBinding Content}" />
<TextBlock x:Name="demo" Text="{Binding RelativeSource={RelativeSource TemplatedParent}}" />
</StackPanel>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}">
<DataTrigger.Value>
<system:String>Test</system:String>
</DataTrigger.Value>
<Setter TargetName="test" Property="Foreground" Value="Red" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Die Absicht ist in diesem Beispiel auf den Button Text röten wenn es gleich dem Wort "Test" ist. Aber es funktioniert nicht, weil die TemplatedParent
Bindung des Auslösers auf null aufgelöst wird, anstatt auf Button
, das auf Style
angewendet wird. Die TextBlock
namens "demo" wird jedoch wie erwartet auf "System.Windows.Controls.Button: [ButtonText]" festgelegt, dh TemplatedParent
funktioniert ordnungsgemäß auf dieser Ebene. Warum funktioniert es nicht innerhalb der DataTrigger
? Ich weiß, es gibt andere Möglichkeiten, das zu erreichen, aber ich versuche zu verstehen, warum die Bindung nicht so funktioniert, wie ich es erwarte.
hilft es, wenn Sie 1. DataTrigger ändern -> Trigger und 2. TemplatedParent -> Selbst im Trigger? – ASh
@ASh Ja, das funktioniert, aber für meinen tatsächlichen Fall muss ich einen 'DataTrigger' verwenden, weil ich wirklich mit einer Nicht-DependencyProperty des TemplatedParent arbeite. – dlf