打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c# – 在ControlTemplate的DataTrigger中使用时,TemplatedParent为null

考虑这个(已编辑)样式,设计用于其内容为字符串的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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WPF自定义控件与样式(7)
Trigger
WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger
WPF前台数据验证(红框)Validation.ErrorTemplate 附加属性
WPF中Listbox使用
button 鼠标移动上、下 不可用 颜色变化--1
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服