c# – 在ControlTemplate的DataTrigger中使用时,TemplatedParent为null
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在ControlTemplate的DataTrigger中使用时,TemplatedParent为null,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2673字,纯文字阅读大概需要4分钟。
内容图文
![c# – 在ControlTemplate的DataTrigger中使用时,TemplatedParent为null](/upload/InfoBanner/zyjiaocheng/827/6a92bc120d014c87abae18b851940b98.jpg)
考虑这个(已编辑)样式,设计用于其内容为字符串的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.
内容总结
以上是互联网集市为您收集整理的c# – 在ControlTemplate的DataTrigger中使用时,TemplatedParent为null全部内容,希望文章能够帮你解决c# – 在ControlTemplate的DataTrigger中使用时,TemplatedParent为null所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。