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

时间:2013-09-20 08:15:16

标签: wpf xaml datagrid .net-3.5 groupstyle

如果指定了两者,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 个答案:

答案 0 :(得分:8)

GroupStyle.HeaderTemplate属性可让您设置DataTemplate来定义DataGrid中的群组标题。这是标题通常出现在每个组顶部的部分。

来自MSDN

  

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

GroupStyle.ContainerStyle属性允许您添加Style,用于定义每个组项的容器的外观。可以把它想象成每个组项目所在的“框”。在这种情况下,框中的数据看起来像是由DataTemplate设置为DataGrid.ItemsTemplate

来自MSDN

  

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

更新&gt;&gt;&gt;

回应你的评论......你应该看到两者。我猜你的代码来自WPF Tutorials.NET上的WPF DataGrid Control文章(除非你想侵犯他们的版权,否则你真的应该链接到这些文章),这就是你的问题。 ..他们正确实施了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>

尽量记住这一点:

  

绑定到DataTemplate中的数据类型属性...名称中有线索。

     

再次定义ControlControlTemplate的内容...... clue ...... name。