Отобразить заголовок группы в DataGrid аналогичной обычной строке

Есть такая задача: показать клиенту записи в табличном виде. Эти записи могут группироваться по одному полю. Нужно группу отобразить так, чтобы заголовок и данные отдельных записей были выровнены в обычную таблицу (пример на рисунке). Данные просчитаны во вьюмоделях, задача отобразить. Была идея сделать следующее - групповой заголовок отобразить с помощью грида, с описанием столбцов, таким же как и у датагрида. И на первый взгляд получилось отлично - данные в заголовке группы были выровнены по заголовку датагрида. Но при разворачивании группы (реализовано путем изменения видимости ItemsPresenter в в шаблоне для GroupStyle.ContainerStyle) оказалось, что данные строк внутри группы выровнены со смещением относительно соответствующих данных заголовка группы. И при изменении ширины датагрида это несоответствие видно еще больше. Пока идея копать в сторону своей реализации DataGridRowsPresenter с переопределением методов MeasureOverride и ArrangeOverride. Но может кто-то знает более простой способ.

Примерный вид того, что нужно получить


Ответы (1 шт):

Автор решения: Виталий Ефимов

Нашел простой способ как получить желаемый результат.

  1. Удаляем заголовок из описания Template в GroupStyle.ContainerStyle. В шаблоне будет только StackPanel с ItemsPresenter внутри.
  2. Добавляем поддельную запись в ItemsSource, которая будет исполнять роль заголовка.
  3. Сортируем ItemsSource таким образом, чтобы строка с "заголовком группы" была вверху.
  4. Используем StyleSelector который будет применять стиль заголовка группы к нашей поддельной записи и обычный стиль для остальных строк. Тут же можно сделать привязку для Visibility у обычных строк и через привязанное свойство реализовать поведение сворачивания группы.
  5. Используем DataTemplateSelector и DataGridTemplateColumn, если ячейки в этом столбце отличаются для заголовка и обычной строки. Если нужно передавать что-то в ViewModel через привязку, то используем RelativeSource и привязываемся к DataGridRow.
→ Ссылка