protected override List<AutomationPeer> GetChildrenCore()
    {
      Group owner = this.Owner;
      GroupGeneratorNode generatorNode = owner.GeneratorNode;

      if( generatorNode == null )
        return null;

      DataGridContext dataGridContext = owner.DataGridContext;

      if( dataGridContext == null )
        return null;

      CustomItemContainerGenerator customItemContainerGenerator = dataGridContext.CustomItemContainerGenerator;
      IList<object> items;
      bool itemsIsAllItems = false;

      // The way Microsoft check if we are called by an automation that support Virtualization.
      if( ( ItemContainerPatternIdentifiers.Pattern != null ) && ( owner.IsBottomLevel ) && ( dataGridContext.DataGridControl.ItemsHost is DataGridItemsHost ) )
      {
        items = customItemContainerGenerator.GetRealizedDataItemsForGroup( generatorNode );
      }
      else
      {
        items = owner.GetItems();
        itemsIsAllItems = true;
      }

      int itemsCount = ( items == null ) ? 0 : items.Count;
      Hashtable oldDataChildren = m_dataChildren;
      Hashtable oldHeaderFooterChildren = m_headerFooterChildren;

      // Get header count
      HeadersFootersGeneratorNode headerNode = generatorNode.GetHeaderNode();
      int headersCount = ( headerNode == null ) ? 0 : headerNode.ItemCount;

      // Get footer count
      HeadersFootersGeneratorNode footerNode = generatorNode.GetFooterNode();
      int footersCount = ( footerNode == null ) ? 0 : footerNode.ItemCount;

      int childrenCount = itemsCount + headersCount + footersCount;
      m_dataChildren = new Hashtable( itemsCount );
      m_headerFooterChildren = new Hashtable( headersCount + footersCount );

      if( childrenCount == 0 )
        return null;

      DataGridContextAutomationPeer dataGridContextAutomationPeer = dataGridContext.Peer;
      Hashtable dataGridContextItemsPeer = dataGridContextAutomationPeer.ItemPeers;

      DataGridGroupAutomationPeer groupAutomationPeer;
      DataGridItemAutomationPeer itemAutomationPeer;
      List<AutomationPeer> list = new List<AutomationPeer>( childrenCount );

      if( headerNode != null )
      {
        DataGridGroupAutomationPeer.AddHeaderPeer( dataGridContext, headerNode, list, m_headerFooterChildren, oldHeaderFooterChildren );
      }

      int index = 0;

      for( int i = 0; i < itemsCount; i++ )
      {
        object item = items[ i ];
        CollectionViewGroup collectionViewGroup = item as CollectionViewGroup;

        if( collectionViewGroup == null )
        {
          if( ( i == 0 ) && ( itemsIsAllItems ) )
          {
            GeneratorNodeHelper nodeHelper = new GeneratorNodeHelper( generatorNode, 0, 0 );
            nodeHelper.ReverseCalculateIndex();
            index = nodeHelper.SourceDataIndex;
          }

          itemAutomationPeer = oldDataChildren[ item ] as DataGridItemAutomationPeer;

          if( itemAutomationPeer == null )
          {
            if( itemsIsAllItems )
            {
              itemAutomationPeer = dataGridContextAutomationPeer.CreateItemAutomationPeerInternal( item, index + i );
            }
            else
            {
              itemAutomationPeer = dataGridContextAutomationPeer.CreateItemAutomationPeerInternal( item, -1 );
            }
          }
          else
          {
            if( itemsIsAllItems )
            {
              itemAutomationPeer.SetIndex( index + i );
            }
            else
            {
              itemAutomationPeer.SetIndex( -1 );
            }
          }

          // Force EventsSource to be updated
          itemAutomationPeer.GetWrapperPeer();

          if( m_dataChildren[ item ] == null )
          {
            Debug.Assert( itemAutomationPeer != null );
            list.Add( itemAutomationPeer );
            m_dataChildren[ item ] = itemAutomationPeer;

            if( dataGridContextItemsPeer[ item ] == null )
              dataGridContextItemsPeer[ item ] = itemAutomationPeer;
          }
        }
        else
        {
          Group uiGroup =
            customItemContainerGenerator.GetGroupFromCollectionViewGroup( this.Owner, collectionViewGroup );

          if( uiGroup != null )
          {
            groupAutomationPeer = uiGroup.CreateAutomationPeer() as DataGridGroupAutomationPeer;

            if( groupAutomationPeer != null )
              list.Add( groupAutomationPeer );
          }
        }
      }

      if( footerNode != null )
      {
        DataGridGroupAutomationPeer.AddFooterPeer( dataGridContext, footerNode, list, m_headerFooterChildren, oldHeaderFooterChildren );
      }

      return list;
    }
        protected override List <AutomationPeer> GetChildrenCore()
        {
            Group owner = this.Owner;
            GroupGeneratorNode generatorNode = owner.GeneratorNode;

            if (generatorNode == null)
            {
                return(null);
            }

            DataGridContext dataGridContext = owner.DataGridContext;

            if (dataGridContext == null)
            {
                return(null);
            }

            CustomItemContainerGenerator customItemContainerGenerator = dataGridContext.CustomItemContainerGenerator;
            IList <object> items;
            bool           itemsIsAllItems = false;

            // The way Microsoft check if we are called by an automation that support Virtualization.
            if ((ItemContainerPatternIdentifiers.Pattern != null) && (owner.IsBottomLevel) && (dataGridContext.DataGridControl.ItemsHost is DataGridItemsHost))
            {
                items = customItemContainerGenerator.GetRealizedDataItemsForGroup(generatorNode);
            }
            else
            {
                items           = owner.GetItems();
                itemsIsAllItems = true;
            }

            int       itemsCount              = (items == null) ? 0 : items.Count;
            Hashtable oldDataChildren         = m_dataChildren;
            Hashtable oldHeaderFooterChildren = m_headerFooterChildren;

            // Get header count
            HeadersFootersGeneratorNode headerNode = generatorNode.GetHeaderNode();
            int headersCount = (headerNode == null) ? 0 : headerNode.ItemCount;

            // Get footer count
            HeadersFootersGeneratorNode footerNode = generatorNode.GetFooterNode();
            int footersCount = (footerNode == null) ? 0 : footerNode.ItemCount;

            int childrenCount = itemsCount + headersCount + footersCount;

            m_dataChildren         = new Hashtable(itemsCount);
            m_headerFooterChildren = new Hashtable(headersCount + footersCount);

            if (childrenCount == 0)
            {
                return(null);
            }

            DataGridContextAutomationPeer dataGridContextAutomationPeer = dataGridContext.Peer;
            Hashtable dataGridContextItemsPeer = dataGridContextAutomationPeer.ItemPeers;

            DataGridGroupAutomationPeer groupAutomationPeer;
            DataGridItemAutomationPeer  itemAutomationPeer;
            List <AutomationPeer>       list = new List <AutomationPeer>(childrenCount);

            if (headerNode != null)
            {
                DataGridGroupAutomationPeer.AddHeaderPeer(dataGridContext, headerNode, list, m_headerFooterChildren, oldHeaderFooterChildren);
            }

            int index = 0;

            for (int i = 0; i < itemsCount; i++)
            {
                Object item = items[i];
                CollectionViewGroup collectionViewGroup = item as CollectionViewGroup;

                if (collectionViewGroup == null)
                {
                    if ((i == 0) && (itemsIsAllItems))
                    {
                        GeneratorNodeHelper nodeHelper = new GeneratorNodeHelper(generatorNode, 0, 0);
                        nodeHelper.ReverseCalculateIndex();
                        index = nodeHelper.SourceDataIndex;
                    }

                    itemAutomationPeer = oldDataChildren[item] as DataGridItemAutomationPeer;

                    if (itemAutomationPeer == null)
                    {
                        if (itemsIsAllItems)
                        {
                            itemAutomationPeer = dataGridContextAutomationPeer.CreateItemAutomationPeerInternal(item, index + i);
                        }
                        else
                        {
                            itemAutomationPeer = dataGridContextAutomationPeer.CreateItemAutomationPeerInternal(item, -1);
                        }
                    }
                    else
                    {
                        if (itemsIsAllItems)
                        {
                            itemAutomationPeer.SetIndex(index + i);
                        }
                        else
                        {
                            itemAutomationPeer.SetIndex(-1);
                        }
                    }

                    // Force EventsSource to be updated
                    itemAutomationPeer.GetWrapperPeer();

                    if (m_dataChildren[item] == null)
                    {
                        Debug.Assert(itemAutomationPeer != null);
                        list.Add(itemAutomationPeer);
                        m_dataChildren[item] = itemAutomationPeer;

                        if (dataGridContextItemsPeer[item] == null)
                        {
                            dataGridContextItemsPeer[item] = itemAutomationPeer;
                        }
                    }
                }
                else
                {
                    Group uiGroup =
                        customItemContainerGenerator.GetGroupFromCollectionViewGroup(this.Owner, collectionViewGroup);

                    if (uiGroup != null)
                    {
                        groupAutomationPeer = uiGroup.CreateAutomationPeer() as DataGridGroupAutomationPeer;

                        if (groupAutomationPeer != null)
                        {
                            list.Add(groupAutomationPeer);
                        }
                    }
                }
            }

            if (footerNode != null)
            {
                DataGridGroupAutomationPeer.AddFooterPeer(dataGridContext, footerNode, list, m_headerFooterChildren, oldHeaderFooterChildren);
            }

            return(list);
        }