Рассмотрим это (отредактированный вниз) Style
, предназначенный для Button
которого Content
является String
:TemplatedParent равно нулю, когда используется внутри DataTrigger ControlTemplate в
<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>
Намерение в данном примере, чтобы включить кнопку текст красным если он равен слову «Тест» . Но это не сработает, потому что привязка триггера TemplatedParent
разрешает null, а не Button
, к которому применяется Style
. Тем не менее, TextBlock
с именем «demo» будет иметь свой Text
, установленный в «System.Windows.Controls.Button: [ButtonText]», как ожидалось, что означает, что TemplatedParent
работает правильно на этом уровне. Почему он не работает внутри DataTrigger
?
Я знаю, что есть другие способы достижения этого, но я пытаюсь понять, почему привязка не работает так, как я ожидаю.
Помогите, если вы измените 1. DataTrigger -> Триггер и 2. TemplatedParent -> Self в триггере? – ASh
@ASh Да, это действительно работает, но для моего фактического случая мне нужно использовать 'DataTrigger', потому что я действительно работаю с non-DependencyProperty TemplatedParent. – dlf