Свернуть все группы DataGrid программно без использования PagedCollectionView

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

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


person MylesRip    schedule 04.05.2011    source источник
comment
В документации MSDN я нашел следующий комментарий: (CollectionViewGroup) представляет группу, созданную объектом PagedCollectionView на основе его GroupDescriptions. В этом случае кажется невозможным использовать метод DataGrid.CollapseRowGroup, если вы не используете PagedCollectionView. Есть ли другой способ? Кажется действительно странным, что вы можете определять группы (которые можно разворачивать и сворачивать) в DataGrid из DDS без помощи PCV, но вы не можете программно управлять этими группами без PCV.   -  person MylesRip    schedule 05.05.2011


Ответы (1)


Вот что я придумал. Он обеспечивает гибкость для развертывания или свертывания всех уровней или определенных уровней. (При желании это можно отредактировать, чтобы удалить повторяющийся код.) Чтобы развернуть или свернуть все группы на всех уровнях за один вызов, просто передайте «0» для параметра groupingLevel и «true» для параметр collapseAllSublevels. При использовании 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);
    }
person MylesRip    schedule 27.07.2011