template - wpf listview grouping
Establecer el estilo GridViewColumnHeader desde dentro de un estilo ListView (2)
En uno de mis proyectos, he heredado un ListView y he anulado el estilo estableciendo una nueva plantilla de control. También he anulado el estilo del encabezado de la columna. Hasta ahora he encontrado dos formas de hacer esto:
1) Configurando una clave de estilo y haciendo referencia al estilo en GridView:
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
<Setter Property="Background" Value="Wheat" />
</Style>
<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">
2) Al no establecer una clave de estilo para el estilo anterior. Ahora no necesito hacer referencia al estilo en GridView, PERO también reemplaza TODOS los encabezados de lista de mi aplicación independientemente del tipo de vista de lista.
Como utilizo muchas listas de vista en mi aplicación, me gustaría lograr esto de una tercera manera más flexible; configurando GridView.ColumnHeaderContainerStyle desde dentro de un estilo ListView. De esa forma no necesitaría hacer referencia al estilo de encabezado en cada GridView. Aquí hay una versión simplificada de XAML hasta el momento:
<Window.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
<Setter Property="Background" Value="Wheat" />
</Style>
<Style TargetType="{x:Type list:MyListView}">
<Setter Property="GridView.ColumnHeaderContainerStyle" Value="{StaticResource MyHeaderStyle}" />
<Setter Property="Background" Value="Linen" />
</Style>
</Window.Resources>
<list:MyListView>
<list:MyListView.View>
<GridView>
<GridViewColumn Header="Column1" />
<GridViewColumn Header="Column2" />
</GridView>
</list:MyListView.View>
</list:MyListView>
Desafortunadamente, esto no establece el estilo del encabezado ... Si hago este cambio en el XAML anterior, funciona:
<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">
¿Algunas ideas?
Si no hay una clave, se aplica a todos los elementos del TargetType
especificado. Si su estilo tiene una clave, debe usarla explícitamente:
<GridViewColumn HeaderContainerStyle="{StaticResource MyHeaderStyle}" Header="Column1"/>
Alternativamente, puede establecer el estilo dentro de su ListView
, por lo que solo se aplica a los elementos que están dentro de él:
<list:MyListView>
<list:MyListView.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="Wheat" />
</Style>
</list:MyListView.Resources>
</list:MyListView>
Gracias snurre por señalarme en la dirección correcta. Encontré una manera de lograr exactamente lo que quería.
No es necesario que coloque la sección de Recursos dentro de ListView (ese tipo de etiquetas personalizadas para cada ListView es lo que quería eliminar en primer lugar). Los recursos se pueden mover al estilo ListView en su lugar.
Aquí está el XAML actualizado que funciona exactamente como yo quiero:
<Window.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
<Setter Property="Background" Value="Wheat" />
</Style>
<Style TargetType="{x:Type list:MyListView}">
<Style.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource MyHeaderStyle}" />
</Style.Resources>
<Setter Property="Background" Value="Linen" />
</Style>
</Window.Resources>
<list:MyListView>
<list:MyListView.View>
<GridView>
<GridViewColumn Header="Column1" x:Name="col1" />
<GridViewColumn Header="Column2" x:Name="col2" />
</GridView>
</list:MyListView.View>
</list:MyListView>