2

我在 App.xaml 中有一个 DataGrid 样式:

<Style TargetType="{x:Type DataGrid}">
    <Setter Property="Foreground" Value="{StaticResource DataGridItemTextBrush}" />
    <Setter Property="VerticalGridLinesBrush" Value="{StaticResource GridBrush}" />
    <Setter Property="HorizontalGridLinesBrush" Value="{StaticResource GridBrush}" />
    <Setter Property="RowBackground" Value="Transparent" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="HeadersVisibility" Value="Column" />
    <Setter Property="AlternatingRowBackground" Value="#77000000" />
</Style>

这适用于我的应用程序中的所有数据网格。但是,对于我的一个数据网格,如果特定列共享相同的值,我想对我的行进行分组。所以我在那个特定的数据网格上使用以下内容:

<DataGrid.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}" Padding="3"/>
                </StackPanel>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}" >
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander>
                                <Expander.Resources>
                                    <Style TargetType="{x:Type TextBlock}">
                                        <Setter Property="Foreground" Value="White" />
                                    </Style>
                                </Expander.Resources>
                                <Expander.Header>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Path=Name, StringFormat=Set: {0}}" Margin="5,0"/>
                                        <TextBlock Text="{Binding Path=ItemCount, StringFormat=(\{0\} Games)}"/>
                                    </StackPanel>
                                </Expander.Header>
                                <ItemsPresenter />
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</DataGrid.GroupStyle>

问题:现在这个 DataGrid 根据我的 DataGrid 样式正确显示所有内容,除了它将文本(前景)显示为黑色而不是我的样式。

解决方案:我可以通过将我的 ItemsPresenter 修改为以下任何一项来解决问题(尽管我不明白为什么这是必要的):

<ItemsPresenter TextElement.Foreground="{StaticResource DataGridItemTextBrush}"/>

或者

<ItemsPresenter TextBlock.Foreground="{StaticResource DataGridItemTextBrush}" />

问题:谁能解释为什么会发生这种情况和/或提供更好的解决方案来保证我的 ItemsPresenter 不会覆盖我的任何 DataGrid 样式?

谢谢!

4

1 回答 1

3

除非孩子选择覆盖强加的样式,否则样式会向下级联。在ItemsPresenter你的情况下有默认值;你在你的DataGrid风格中没有压倒一切。要么在内部创建一种ItemsPresenter样式App.xaml以满足您的需求,要么通过显式或隐式样式在本地修改值,或者选择您提出的解决方案。

还要记住,您可以使用该BasedOn属性来继承默认样式;仅覆盖某些属性。

BasedOn="{StaticResource {x:Type DataGrid}}"
于 2011-08-16T16:30:47.337 回答