В чем разница между HeaderTemplate и ContainerStyle в GroupStyle WPF DataGrid?

Может показаться, что ContainerStyle используется вместо HeaderTemplate, когда указаны оба, как показано ниже;

<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>

Единственная разница в том, что HeaderTemplate не имеет доступа к ItemsPresenter, или разница связана с иерархическими структурами данных?

Спасибо!

Отредактировано для ссылки на http://wpftutorial.net/DataGrid.html#grouping. На самом деле я не брал пример непосредственно оттуда, но это отличный сайт, так что в любом случае у них может быть ссылка.


person Julius    schedule 20.09.2013    source источник


Ответы (1)


Свойство GroupStyle.HeaderTemplate позволяет вам установить DataTemplate, чтобы определить, как будут выглядеть заголовки групп в DataGrid. Это та часть, где заголовок обычно появляется в верхней части каждой группы.

Из MSDN:

Получает или задает шаблон, используемый для отображения заголовка группы.

Свойство GroupStyle.ContainerStyle позволяет добавить Style, определяющее, как будет выглядеть контейнер каждого элемента группы. Думайте об этом как о «коробке», в которой будут находиться элементы каждой группы. В этом случае то, как будут выглядеть данные внутри коробки, определяется набором DataTemplate как DataGrid.ItemsTemplate.

Из MSDN:

Позволяет автору приложения предоставлять пользовательскую логику выбора стиля для применения к каждому сгенерированному GroupItem.

ОБНОВИТЬ >>>

В ответ на ваш комментарий... вы должны увидеть оба. Я предполагаю, что ваш код взят из статьи WPF DataGrid Control на WPF Tutorials.NET (которая вы на самом деле должны были сделать ссылку, если вы не хотите нарушать их авторские права), и это ваша проблема... они не реализовали ContainerStyle должным образом.

Чтобы быть более точным, они не реализовали ControlTemplate в ContainerStyle должным образом. Когда вы определяете ControlTemplate, обычно принято добавлять внутрь ContentPresenter для «представления содержимого», которое в данном случае происходит от DataTemplate в HeaderTemplate. Если вы добавите один, вы увидите оба работающих шаблона:

<ControlTemplate TargetType="{x:Type GroupItem}">
    <Expander IsExpanded="true" Background="Violet">
        <Expander.Header>
            <DockPanel TextBlock.FontWeight="Bold">
                <ContentPresenter /> 
            </DockPanel>
        </Expander.Header>
        <ItemsPresenter />
    </Expander>
</ControlTemplate>

Постарайтесь запомнить это:

Привяжите к своим свойствам типа данных в DataTemplates... подсказка находится в названии.

Определите, как Control выглядит в ControlTemplates... опять же, подсказка... имя.

person Sheridan    schedule 20.09.2013
comment
Спасибо за объяснение, но я все еще не понимаю, почему вы не видите обоих? Если я определяю как шаблон для заголовка группы и стиль, который шаблонирует контейнер, почему бы мне не увидеть шаблон заголовка над шаблоном контейнера? - person Julius; 20.09.2013
comment
Является ли ответ тем, что по умолчанию шаблон для GroupItem имеет заполнитель для заголовка, который заполняется HeaderTemplate, но если вы перезапишете шаблон GroupItem и не предоставите заполнитель для заголовка, он не будет использоваться? - person Julius; 20.09.2013