¿Cuál es la diferencia entre HeaderTemplate y ContainerStyle en WPF DataGrid''s GroupStyle?
xaml .net-3.5 (1)
Parecería que el estilo del ContainerStyle
se usa con preferencia a HeaderTemplate
cuando se especifican ambos, como se muestra a continuación;
<controls:DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}" Background="Yellow" />
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="true" Background="Violet">
<Expander.Header>
<DockPanel TextBlock.FontWeight="Bold">
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=ItemCount}"/>
</DockPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</controls:DataGrid.GroupStyle>
¿La única diferencia es que HeaderTemplate
no tiene acceso al ItemsPresenter
, o la diferencia tiene que ver con las estructuras jerárquicas de datos?
¡Gracias!
Editado para vincular a http://wpftutorial.net/DataGrid.html#grouping . En realidad, no tomé el ejemplo directamente desde allí, pero es un gran sitio para que puedan tener un enlace de todos modos.
La propiedad GroupStyle.HeaderTemplate
permite configurar una DataTemplate
para definir cómo se verán los encabezados de grupo en DataGrid
. Esta es la parte donde el título generalmente aparece en la parte superior de cada grupo.
Desde MSDN :
Obtiene o establece la plantilla que se utiliza para mostrar el encabezado del grupo.
La propiedad GroupStyle.ContainerStyle
permite agregar un Style
que define cómo se verá el contenedor de cada elemento de grupo. Piense en esto como la ''caja'' en la que se colocarán los elementos de cada grupo. En este caso, cómo se verán los datos dentro del cuadro está definido por un conjunto de DataTemplate
como DataGrid.ItemsTemplate
.
Desde MSDN :
Permite que el escritor de la aplicación proporcione una lógica de selección personalizada para que un estilo se aplique a cada
GroupItem
generado.
ACTUALIZACIÓN >>>
En respuesta a tu comentario ... deberías ver ambos. Supongo que su código proviene del artículo WPF DataGrid Control sobre WPF Tutorials.NET (al que realmente debería haber vinculado a menos que quiera infringir sus derechos de autor) y este es su problema ... no han implementado el ContainerStyle
correctamente .
Para ser más precisos, no han implementado el ControlTemplate
en el ContainerStyle
correctamente. Cuando define un ControlTemplate
, generalmente se acostumbra agregar un ContentPresenter
dentro para ''presentar el contenido'', que en este caso proviene de DataTemplate
en HeaderTemplate
. Si agrega uno, verá las dos plantillas funcionando:
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="true" Background="Violet">
<Expander.Header>
<DockPanel TextBlock.FontWeight="Bold">
<ContentPresenter />
</DockPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
Trata de recordar esto:
Enlace a sus propiedades de tipo de datos en
DataTemplate
s ... la pista está en el nombre.Defina cómo se ve el
Control
enControlTemplate
s ... otra vez, pista ... nombre.