2

我正在尝试在 Xaml(而不是代码隐藏)中为相对简单的应用程序做尽可能多的事情。我将 DataGrid 绑定到 Silverlight 4 中的 DomainDataSource,并将 DomainDataSource 的 GroupDescriptors 绑定到 ComboBoxes,从而允许用户根据他们选择的值对 DataGrid 中的行进行分组。我想让他们能够单击一个按钮来折叠/展开所有组。我知道这可以使用 PagedCollectionView 来完成,但是我最终会在代码隐藏中进行分组等。有没有办法在不使用 PagedCollectionView的情况下做到这一点?

我知道 DataGrid.CollapseRowGroup(CollectionViewGroup collectionViewGroup, bool collapseAllSubgroups) 方法,但我还没有找到遍历顶级组的方法。

4

1 回答 1

0

这就是我想出的。它提供了扩展或折叠所有级别或特定级别的灵活性。(如果需要,可以重构以删除重复代码。)要在单个调用中展开或折叠所有级别的所有组,只需为 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);
    }
于 2011-07-27T17:31:55.367 回答