【问题标题】:Style is being overridden when value uses Binding当值使用绑定时样式被覆盖
【发布时间】:2012-12-20 01:04:21
【问题描述】:

我在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>

但是发生了什么(这给我带来了一个漫长的噩梦,我认为我的数据绑定不正确,因为我看不到任何更改),当数据被绑定时,前景色默认为黑色。我的数据绑定文本在黑色背景上是黑色的,我什至没有意识到最长的时间。

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

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

【问题讨论】:

  • 如果你用一些文本替换绑定,你会意识到问题与绑定没有任何关系。
  • TextBlock 的默认样式似乎在 DataTemplate 中被忽略。找到this question,虽然它是 Silverlight,而不是 WPF。另请参阅this page

标签: wpf xaml binding styles


【解决方案1】:

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

This page引用微软给出的以下两条声明:

这种行为是“设计使然”,这就是原因。模板被视为 一个封装边界。这些模板产生的元素落在 在这个边界内。并查找具有匹配的样式 TargetType 在此边界处停止。因此复制中的 TextBlock 通过模板生成的不会在 题。而在模板外部定义的 TextBlock 则可以。 解决此问题的一种方法是为 在 TextBlock 内的 TextBlock 上按此名称设置样式并引用样式 模板。

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

【讨论】:

  • 这当然有助于我理解这至少不是我的错。
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 2017-07-15
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2021-10-17
相关资源
最近更新 更多