これが私が思いついたものです。すべてのレベルまたは特定のレベルを展開または折りたたむ柔軟性を提供します。(必要に応じて、これをリファクタリングして重複コードを削除できます。) 1回の呼び出しですべてのレベルのすべてのグループを展開または折りたたむには、groupingLevelパラメーターに「0」、collapseAllSublevelsパラメーターに「true」を渡すだけです。HashSetを使用することにより、重複は「グループ」コレクションから自動的に削除されます。
/// <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);
}