考虑这个(已编辑)样式,设计用于其内容为字符串的Button:
<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>
此示例中的意图是,如果按钮文本等于单词“Test”1,则将其变为红色.但它不起作用,因为触发器的TemplatedParent绑定解析为null而不是应用Style的Button.但是,名为“demo”的TextBlock将其Text设置为“System.Windows.Controls.Button:[ButtonText]”,这意味着TemplatedParent在该级别上正常工作.为什么它在DataTrigger中不起作用?
1我知道还有其他方法可以实现这一点,但我试图理解为什么绑定不像我期望的那样工作.
最佳答案:
ControlTemplate.Triggers中的TemplatedParent不是您所期望的.在内部触发器中,它实际上引用了Button.TemplatedParent.因此,如果您在模板中创建该按钮,它将仅为非null.您不在模板中创建按钮,因此在您的情况下它是null.现在考虑这个xaml:
<Window.Resources> <Style x:Key="Test" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <StackPanel> <TextBlock x:Name="text" Text="dummy" /> <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="text" Property="Foreground" Value="Red" /> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="Test2" TargetType="ContentControl"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ContentControl"> <Button Style="{StaticResource Test}"></Button> </ControlTemplate> </Setter.Value> </Setter> </Style></Window.Resources><Grid> <!--<Button Content="Test" Style="{StaticResource Test}"/>--> <ContentControl Style="{StaticResource Test2}" Content="Test" /></Grid>
在这里,我重新尝试ContentControl和内部模板,我使用您的模板按钮.如果运行此代码,您将看到红色的“虚拟”文本,因为Button.TemplatedParent现在是ContentControl,它的内容等于“Test”,这证实了我上面所说的内容.
现在回到你的问题:只需将RelativeSource TemplatedParent更改为RelativeSource Self(无需将DataTrigger更改为Trigger) – 这个将引用你的Button.
来源:http://www.icode9.com/content-1-191901.html联系客服