Почему ItemsPresenter переопределяет стиль переднего плана моей DataGrid? - PullRequest
2 голосов
/ 02 апреля 2010

У меня есть стиль 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 Ответ

3 голосов
/ 16 августа 2011

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

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

BasedOn="{StaticResource {x:Type DataGrid}}"
...