Perché ItemsPresenter sovrascrivono il mio stile di primo piano del DataGrid?
-
24-09-2019 - |
Domanda
Ho uno stile DataGrid in 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>
Questa grande opera per tutto il mio datagrid è nelle mie applicazioni. Tuttavia, per uno dei miei DataGrids, voglio gruppo mie righe se una colonna specifica condivide gli stessi valori. Così ho utilizzare il seguente su quel particolare DataGrid:
<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:. Ora questo DataGrid visualizza tutto correttamente in base alla mia stile DataGrid, tranne che visualizza il testo (in primo piano) come nero invece del mio stile
Soluzione: posso risolvere il problema (anche se non capisco il motivo per cui ciò sia necessario) modificando il mio ItemsPresenter a uno dei seguenti:
<ItemsPresenter TextElement.Foreground="{StaticResource DataGridItemTextBrush}"/>
o
<ItemsPresenter TextBlock.Foreground="{StaticResource DataGridItemTextBrush}" />
Domanda:? Qualcuno può spiegare perché questo accade e / o offrire una soluzione migliore che garantisca che il mio ItemsPresenter non sostituisce nessuno dei miei stili DataGrid
Grazie!
Soluzione
Styling cascate giù a meno che i opta figlio di sovrascrivere lo stile imposto. Il ItemsPresenter
nel tuo caso ha valori di default; che non abbiano la prevalenza all'interno del vostro stile DataGrid
. O creare uno stile ItemsPresenter
entro App.xaml
per soddisfare le vostre esigenze o modificare il valore localmente tramite uno stile esplicita o implicita, oppure optare per la soluzione proposta.
Anche tenere a mente che è possibile utilizzare la proprietà BasedOn
di ereditare lo stile di default; sovrascrivendo solo alcune proprietà.
BasedOn="{StaticResource {x:Type DataGrid}}"