Почему ItemsPresenter переопределяет стиль переднего плана моей DataGrid?

У меня есть стиль DataGrid в App.xaml:

<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?

Спасибо!

1 ответ

Решение

Стили каскадно снижаются, если ребенок не решает переопределить навязанный стиль. ItemsPresenter в вашем случае есть значения по умолчанию; который вы не перекрываете в своем DataGrid стиль. Либо создать ItemsPresenter стиль внутри App.xaml чтобы удовлетворить ваши потребности или изменить значение локально с помощью явного или неявного стиля, или выбрать предложенное решение.

Также имейте в виду, что вы можете использовать BasedOn свойство наследовать стили по умолчанию; перекрывая только определенные свойства.

BasedOn="{StaticResource {x:Type DataGrid}}"
Другие вопросы по тегам