Свернуть все группы DataGrid программно без использования PagedCollectionView - PullRequest
1 голос
/ 04 мая 2011

Я пытаюсь сделать как можно больше в Xaml (а не в виде кода) для относительно простого приложения.У меня есть DataGrid, привязанный к DomainDataSource в Silverlight 4, и я связываю GroupDescriptors DomainDataSource с ComboBox, позволяя пользователю группировать строки в DataGrid в соответствии с выбранными значениями.Я хотел бы дать им возможность нажать кнопку, чтобы свернуть / развернуть все группы.Я знаю, что это можно сделать с помощью PagedCollectionView, но затем я заканчиваю группировкой и т. Д. В коде позади.Есть ли способ выполнить это без , используя PagedCollectionView?

Мне известен метод DataGrid.CollapseRowGroup (CollectionViewGroup collectionViewGroup, bool collapseAllSubgroups), но я не нашел способаперебирать группы верхнего уровня.

1 Ответ

0 голосов
/ 27 июля 2011

Вот что я придумал.Это обеспечивает гибкость, чтобы расширить или свернуть все уровни или определенные уровни.(При желании это можно изменить, чтобы удалить дублирующийся код.) Чтобы развернуть или свернуть все группы на всех уровнях за один вызов, просто передайте "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);
    }
...