ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-16 14:07:40  阅读:249  来源: 互联网

标签:c wpf xaml controltemplate wpf-style


考虑这个(已编辑)样式,设计用于其内容为字符串的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,wpf,xaml,controltemplate,wpf-style
来源: https://codeday.me/bug/20190516/1115616.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有