WPF DataGrid 的 GroupStyle 中,HeaderTemplate 和 ContainerStyle 有什么区别?

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。我实际上没有直接从那里拿到示例,但那是一个非常好的网站,因此它们可以获得链接。
1个回答

9
GroupStyle.HeaderTemplate属性允许您设置一个DataTemplate,以定义DataGrid中组标题的外观。这通常是每个组顶部出现的标题部分。
MSDN获取:

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

GroupStyle.ContainerStyle属性允许您添加一个Style来定义每个组项容器的外观。将其视为每个组项所在的“盒子”。在这种情况下,盒子内部的数据外观由设置为DataGrid.ItemsTemplateDataTemplate定义。
MSDN获取:

启用应用程序编写器为要应用于每个生成的GroupItem的样式提供自定义选择逻辑。

更新>>> 根据您的评论...您应该同时看到两者。我猜您的代码来自WPF Tutorials.NET上的WPF DataGrid Control文章(除非您想侵犯他们的版权,否则您真的应该链接到它们),这是您的问题...他们没有正确实现ContainerStyle
更准确地说,他们没有正确实现ContainerStyle中的ControlTemplate。当您定义一个ControlTemplate时,通常习惯在内部添加一个ContentPresenter来“呈现内容”,这种情况下的内容来自HeaderTemplate中的DataTemplate。如果您添加了一个,您将会看到两个模板都在起作用:
<ControlTemplate TargetType="{x:Type GroupItem}">
    <Expander IsExpanded="true" Background="Violet">
        <Expander.Header>
            <DockPanel TextBlock.FontWeight="Bold">
                <ContentPresenter /> 
            </DockPanel>
        </Expander.Header>
        <ItemsPresenter />
    </Expander>
</ControlTemplate>

请记住以下内容:

DataTemplate 中绑定数据类型的属性... 暗示已经在名字中了。

定义 ControlTemplate 中控件的外观... 再次,暗示... 名字。


谢谢您的解释,但我仍然不明白为什么您看不到两者?如果我定义了一个组头的模板和一个样式来模板化容器,为什么我不能在容器模板上方看到头部模板呢? - Julius
2
默认情况下,GroupItem的模板中有一个用于标题的占位符,由HeaderTemplate填充。但是,如果您覆盖了GroupItem的模板并且没有提供标题的占位符,则不会使用它吗? - Julius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接