internal void SortGroups(List <GroupSortComparer> groupSortComparers, int level)
        {
            int itemCount = this.ProtectedItemCount;

            if (itemCount == 0)
            {
                return;
            }

            int[] indexes;
            indexes = new int[itemCount + 1];
            for (int i = 0; i < itemCount; i++)
            {
                indexes[i] = i;
            }

            DataGridCollectionViewGroup[] subGroupsArray = new DataGridCollectionViewGroup[itemCount];
            m_subGroups.Values.CopyTo(subGroupsArray, 0);

            // "Weak heap sort" sort array[0..NUM_ELEMENTS-1] to array[1..NUM_ELEMENTS]
            DataGridCollectionViewGroupSort collectionViewSort = new DataGridCollectionViewGroupSort(indexes, groupSortComparers[level], subGroupsArray);

            collectionViewSort.Sort(itemCount);
            level++;
            m_protectedItems.Clear();

            for (int i = 1; i <= itemCount; i++)
            {
                DataGridCollectionViewGroup group = subGroupsArray[indexes[i]];

                // Sort sub groups
                if (!group.IsBottomLevel)
                {
                    group.SortGroups(groupSortComparers, level);
                }

                m_protectedItems.Add(group);
            }

            this.ProtectedItemCount = m_protectedItems.Count;
            m_protectedItemsCollectionChanged.Invoke(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }