当值使用Binding时,样式被覆盖

时间:2013-01-05 21:39:19

标签: wpf xaml binding styles

我在UserControl.Resources

中设置了两种样式
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="white" />
    </Style>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="white" />
    </Style>

因此,在我的DataTemplate中(请注意我将其余内容删除),我将应用白色文字,而无需更改每个LabelTextBlock元素的属性

<DataTemplate x:Key="FileTransferItemTemplate">
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <Label Content="Transferring With: " />
                <TextBlock Text="{Binding Path=OtherUserName, Mode=TwoWay}" />
            </StackPanel>
</DataTemplate>

虽然发生了什么(这导致我长时间的噩梦,我认为我是不正确的数据绑定,因为我看不到任何变化),是数据绑定时前景色默认为黑色。我的数据绑定文本在黑色背景上是黑色的,我甚至没有意识到最长的时间。

我可以覆盖此方法的唯一方法是在Foreground="White"上手动设置TextBlockLabel适用于颜色,因为它不是数据绑定。

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:3)

问题与绑定无关。似乎从DataTemplate内部查找外部定义的默认样式仅适用于从Control派生的元素。由于TextBlock不是从Control派生的,因此找不到您的默认样式。

This page引用了Microsoft提供的以下两个陈述:

  

这种行为是'按设计',这就是原因。模板被视为   封装边界。这些模板产生的元素下降   在这个边界内。并查找具有匹配的样式   TargetType在此边界处停止。因此repro中的TextBlock   通过模板生成的内容不会获取样式   题。而在模板外定义的TextBlock确实如此。   解决此问题的一种方法是给出一个明确的名称   样式并在TextBlock中通过此名称引用样式   模板。

  

查找时,模板被视为封装边界   对于不是Control的子类型的元素的隐式样式。