private DataGridCollectionViewGroup CreateSubGroup(object groupName, int level, ObservableCollection <GroupDescription> groupByList,
                                                           List <GroupSortComparer> groupSortComparers)
        {
            // If sortComparers is null, we are in massive group creation, no order check.
            var group = new DataGridCollectionViewGroup(groupName, this, m_nextSubGroupUnsortedIndex);

            var dataGridGroupDescription = groupByList[level] as DataGridGroupDescription;

            if (dataGridGroupDescription != null)
            {
                group.GroupByName = dataGridGroupDescription.PropertyName;
            }

            unchecked
            {
                m_nextSubGroupUnsortedIndex++;
            }

            int index;

            if (groupSortComparers == null)
            {
                Debug.Assert(this.ProtectedItemCount == this.ProtectedItems.Count);
                index = this.ProtectedItemCount;
            }
            else
            {
                index = this.BinarySearchGroup(group, groupSortComparers[level]);

                if (index < 0)
                {
                    index = ~index;
                }
            }

            level++;

            if (level < groupByList.Count)
            {
                group.SetSubGroupBy(groupByList[level]);
                group.CreateFixedGroupNames(level, groupByList, groupSortComparers);
            }

            this.InsertGroup(index, group);
            return(group);
        }
    private DataGridCollectionViewGroup CreateSubGroup( object groupName, int level, ObservableCollection<GroupDescription> groupByList, GroupSortComparer[] groupSortComparers )
    {
      // If sortComparers is null, we are in massive group creation, no order check.
      DataGridCollectionViewGroup group = new DataGridCollectionViewGroup( groupName, this, m_nextSubGroupUnsortedIndex );

      unchecked
      {
        m_nextSubGroupUnsortedIndex++;
      }

      int index;

      if( groupSortComparers == null )
      {
        Debug.Assert( this.ProtectedItemCount == this.ProtectedItems.Count );
        index = this.ProtectedItemCount;
      }
      else
      {
        index = this.BinarySearchGroup( group, groupSortComparers[ level ] );

        if( index < 0 )
          index = ~index;
      }

      level++;

      if( level < groupByList.Count )
      {
        group.SetSubGroupBy( groupByList[ level ] );
        group.CreateFixedGroupNames( level, groupByList, groupSortComparers );
      }

      this.InsertGroup( index, group );
      return group;
    }