Отобразить заголовок группы в DataGrid аналогичной обычной строке
Есть такая задача: показать клиенту записи в табличном виде. Эти записи могут группироваться по одному полю. Нужно группу отобразить так, чтобы заголовок и данные отдельных записей были выровнены в обычную таблицу (пример на рисунке). Данные просчитаны во вьюмоделях, задача отобразить. Была идея сделать следующее - групповой заголовок отобразить с помощью грида, с описанием столбцов, таким же как и у датагрида. И на первый взгляд получилось отлично - данные в заголовке группы были выровнены по заголовку датагрида. Но при разворачивании группы (реализовано путем изменения видимости ItemsPresenter в в шаблоне для GroupStyle.ContainerStyle) оказалось, что данные строк внутри группы выровнены со смещением относительно соответствующих данных заголовка группы. И при изменении ширины датагрида это несоответствие видно еще больше. Пока идея копать в сторону своей реализации DataGridRowsPresenter с переопределением методов MeasureOverride и ArrangeOverride. Но может кто-то знает более простой способ.
Ответы (1 шт):
Нашел простой способ как получить желаемый результат.
- Удаляем заголовок из описания Template в GroupStyle.ContainerStyle. В шаблоне будет только StackPanel с ItemsPresenter внутри.
- Добавляем поддельную запись в ItemsSource, которая будет исполнять роль заголовка.
- Сортируем ItemsSource таким образом, чтобы строка с "заголовком группы" была вверху.
- Используем StyleSelector который будет применять стиль заголовка группы к нашей поддельной записи и обычный стиль для остальных строк. Тут же можно сделать привязку для Visibility у обычных строк и через привязанное свойство реализовать поведение сворачивания группы.
- Используем DataTemplateSelector и DataGridTemplateColumn, если ячейки в этом столбце отличаются для заголовка и обычной строки. Если нужно передавать что-то в ViewModel через привязку, то используем RelativeSource и привязываемся к DataGridRow.
