Свернуть все группы DataGrid программно без использования PagedCollectionView
Я пытаюсь сделать как можно больше в Xaml (а не в виде кода) для относительно простого приложения. У меня есть DataGrid, привязанный к DomainDataSource в Silverlight 4, и я связываю GroupDescriptors DomainDataSource с ComboBox, позволяя пользователю группировать строки в DataGrid в соответствии с выбранными значениями. Я хотел бы дать им возможность нажать кнопку, чтобы свернуть / развернуть все группы. Я знаю, что это можно сделать с помощью PagedCollectionView, но затем я заканчиваю группировкой и т. Д. В коде позади. Есть ли способ сделать это без использования PagedCollectionView?
Мне известен метод DataGrid.CollapseRowGroup(CollectionViewGroup collectionViewGroup, bool collapseAllSubgroups), но я не нашел способа перебора групп верхнего уровня.
1 ответ
Вот что я придумал. Это обеспечивает гибкость, чтобы расширить или свернуть все уровни или определенные уровни. (При желании это можно изменить, чтобы удалить дублирующийся код.) Чтобы развернуть или свернуть все группы на всех уровнях за один вызов, просто передайте "0" для параметра groupingLevel и "true" для параметра collapseAllSublevels. При использовании HashSet дубликаты автоматически удаляются из коллекции "groups".
/// <summary>
/// Collapse all groups at a specific grouping level.
/// </summary>
/// <param name="groupingLevel">The grouping level to collapse. Level 0 is the top level. Level 1 is the next level, etc.</param>
/// <param name="collapseAllSublevels">Indicates whether levels below the specified level should also be collapsed. The default is "false".</param>
private void CollapseGroups(int groupingLevel, bool collapseAllSublevels = false)
{
if (myGrid.ItemsSource == null)
return;
HashSet<CollectionViewGroup> groups = new HashSet<CollectionViewGroup>();
foreach (object item in myGrid.ItemsSource)
groups.Add(myGrid.GetGroupFromItem(item, groupingLevel));
foreach (CollectionViewGroup group in groups)
myGrid.CollapseRowGroup(group, collapseAllSublevels);
}
/// <summary>
/// Expand all groups at a specific grouping level.
/// </summary>
/// <param name="groupingLevel">The grouping level to expand. Level 0 is the top level. Level 1 is the next level, etc.</param>
/// <param name="expandAllSublevels">Indicates whether levels below the specified level should also be expanded. The default is "false".</param>
private void ExpandGroups(int groupingLevel, bool expandAllSublevels = false)
{
if (myGrid.ItemsSource == null)
return;
HashSet<CollectionViewGroup> groups = new HashSet<CollectionViewGroup>();
foreach (object item in myGrid.ItemsSource)
groups.Add(myGrid.GetGroupFromItem(item, groupingLevel));
foreach (CollectionViewGroup group in groups)
myGrid.ExpandRowGroup(group, expandAllSublevels);
}