在 DataGrid 中显示组 header 类似于常规行

Display group header in DataGrid similar to regular row

有这样一个任务:将客户记录以表格的形式展示出来。这些记录可以按一个字段分组。您需要以这样一种方式显示组,即各个记录的标题和数据以常规 table 对齐(图片中的示例)。数据在视图模型中计算,任务是显示它。有一个想法可以执行以下操作 - 使用网格显示组 header,其中包含列的描述,与数据网格中的相同。乍一看,结果很好——组 header 中的数据与数据网格 header 对齐。但是在扩展组时(通过更改模板中 ItemsPresenter 的可见性实现 GroupStyle.ContainerStyle),结果发现组内的行数据与相对于相应组的偏移量对齐 header数据。当更改数据网格的宽度时,这种差异更加明显。虽然这个想法是通过覆盖 MeasureOverride 和 ArrangeOverride 方法来挖掘其 DataGridRowsPresenter 的实现。但也许有人知道更简单的方法。

找到了获得所需结果的简单方法。

  1. 从 GroupStyle.ContainerStyle 中的模板描述中删除 header 元素。该模板将只有一个 StackPanel,里面有一个 ItemsPresenter。
  2. 向将充当组的 ItemsSource 添加一个假条目 header。
  3. 对 ItemsSource 进行排序,使带有“group header”的行位于顶部。
  4. 使用 StyleSelector,它将组 header 样式应用于我们的假组 header 行,并将正常样式应用于其余行。这里也可以为普通行绑定Visibility,通过绑定属性.
  5. 实现分组折叠行为
  6. 如果此列中的单元格对于 header 和普通行不同,则使用 DataTemplateSelector 和 DataGridTemplateColumn。如果您需要通过绑定将某些内容传递给 ViewModel,那么我们使用 RelativeSource 并绑定到 DataGridRow。