Por que os itens representantes substituem o estilo de primeiro plano do meu datagrid?
-
24-09-2019 - |
Pergunta
Eu tenho um estilo datagrid no 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>
Isso funciona muito bem para todos os meus datagrid em meus aplicativos. No entanto, para um dos meus datagrids, quero agrupar minhas linhas se uma coluna específica compartilhar os mesmos valores. Então, eu uso o seguinte nesse datagrid em particular:
<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>
Problema: Agora, esse datagrid exibe tudo corretamente com base no meu estilo datagrid, exceto que exibe o texto (primeiro plano) como preto em vez do meu estilo.
Solução: Eu posso resolver o problema (embora não entenda por que isso é necessário) modificando meu representante de itens para qualquer um dos seguintes:
<ItemsPresenter TextElement.Foreground="{StaticResource DataGridItemTextBrush}"/>
ou
<ItemsPresenter TextBlock.Foreground="{StaticResource DataGridItemTextBrush}" />
Pergunta: Alguém pode explicar por que isso acontece e/ou oferecer uma solução melhor que garantirá que o meu representante de itens não substitua nenhum dos meus estilos de datagrid?
Obrigada!
Solução
O estilo de cascata para baixo, a menos que a criança opte por substituir o estilo imposto. o ItemsPresenter
No seu caso, possui valores padrão; que você não está substituindo em seu DataGrid
estilo. Crie um ItemsPresenter
estilo dentro App.xaml
Para atender às suas necessidades ou modificar o valor localmente por meio de um estilo explícito ou implícito ou optar por sua solução proposta.
Também lembre -se de que você pode usar o BasedOn
propriedade para herdar o estilo padrão; substituindo apenas certas propriedades.
BasedOn="{StaticResource {x:Type DataGrid}}"