8

当两者都被指定时,似乎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。我实际上并没有直接从那里拿这个例子,但这是一个很棒的网站,所以他们无论如何都可以有一个链接。

4

1 回答 1

9

GroupStyle.HeaderTemplate属性允许您设置 aDataTemplate来定义组标题的DataGrid外观。这是标题通常出现在每组顶部的部分。

来自MSDN

获取或设置用于显示组头的模板。

GroupStyle.ContainerStyle属性允许您添加一个Style定义每个组项的容器的外观。可以将其想象成每个组项目所在的“盒子”。在这种情况下,盒子内的数据将由一个DataTemplate集合定义为DataGrid.ItemsTemplate.

来自MSDN

使应用程序编写者能够为样式提供自定义选择逻辑以应用于每个生成的GroupItem.

更新>>>

作为对您的评论的回应……您应该看到两者。我猜您的代码来自 WPF Tutorials.NET 上的WPF DataGrid Control文章(除非您想侵犯他们的版权,否则您确实应该链接到该文章),这是您的问题......他们没有正确实施ContainerStyle

更准确地说,他们没有正确实施ControlTemplateContainerStyle当您定义 aControlTemplate时,通常习惯性地添加一个内部来“呈现内容”,在这种情况下,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>

试着记住这一点:

在 s 中绑定到您的数据类型属性DataTemplate...线索就在名称中。

再次定义 s... 中的Control外观ControlTemplate,线索... 名称。

于 2013-09-20T08:24:16.793 回答