IRawElementProviderSimple IGridProvider.GetItem(int row, int column)
        {
            if (m_dataGridContext == null)
            {
                return(null);
            }

            // Here we only consider data item.  No header / footer are part of the IGridProvider.
            CollectionView items = m_dataGridContext.Items;

            if ((row < 0) || (row >= items.Count))
            {
                throw new ArgumentOutOfRangeException("row");
            }

            ReadOnlyObservableCollection <ColumnBase> visibleColumns = m_dataGridContext.VisibleColumns;

            if ((column < 0) || (column >= visibleColumns.Count))
            {
                throw new ArgumentOutOfRangeException("column");
            }

            object item = m_dataGridContext.Items.GetItemAt(row);
            DataGridItemAutomationPeer itemPeer = m_dataChildren[item] as DataGridItemAutomationPeer;

            if (itemPeer == null)
            {
                // If the item is not found in the cache, try to force is creation in the caching.
                CollectionViewGroup[] groups;
                this.GetParentGroupsContainingItemIndex(row, out groups);

                this.ForceChildrenCaching(groups);
                itemPeer = m_dataChildren[item] as DataGridItemAutomationPeer;
            }

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

            DataGridItemCellAutomationPeer cellPeer = itemPeer.GetDataGridItemCellPeer(visibleColumns[column]);

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

            return(this.ProviderFromPeer(cellPeer));
        }
        protected override List <AutomationPeer> GetChildrenCore()
        {
            DataRow dataRow = m_dataGridContext.CustomItemContainerGenerator.ContainerFromItem(m_item) as DataRow;

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

            // Get child context ( Detail )
            DetailConfigurationCollection detailConfigurations = m_dataGridContext.DetailConfigurations;
            int detailConfigurationsCount = detailConfigurations.Count;

            ReadOnlyObservableCollection <ColumnBase> visibleColumns = m_dataGridContext.VisibleColumns;
            int visibleColumnsCount = visibleColumns.Count;

            if (visibleColumnsCount + detailConfigurationsCount <= 0)
            {
                return(null);
            }

            Hashtable             oldDataChildren = m_dataChildren;
            List <AutomationPeer> list            = new List <AutomationPeer>(visibleColumnsCount + detailConfigurationsCount);

            m_dataChildren = new Hashtable(visibleColumnsCount + detailConfigurationsCount);

            for (int i = 0; i < visibleColumnsCount; i++)
            {
                ColumnBase column = visibleColumns[i];

                DataGridItemCellAutomationPeer cellAutomationPeer =
                    oldDataChildren[column] as DataGridItemCellAutomationPeer;

                if (cellAutomationPeer == null)
                {
                    cellAutomationPeer = new DataGridItemCellAutomationPeer(this, column);
                }

                // Always resetting the ColumnIndex since the visible position can have changed
                cellAutomationPeer.ColumnIndex = i;

                list.Add(cellAutomationPeer);
                m_dataChildren[column] = cellAutomationPeer;
            }

            for (int i = 0; i < detailConfigurationsCount; i++)
            {
                DetailConfiguration           detailConfiguration = detailConfigurations[i];
                DataGridContextAutomationPeer detailDataGridContextAutomationPeer = null;

                detailDataGridContextAutomationPeer =
                    oldDataChildren[detailConfiguration] as DataGridContextAutomationPeer;

                if (detailDataGridContextAutomationPeer == null)
                {
                    detailDataGridContextAutomationPeer = new DataGridContextAutomationPeer(
                        m_dataGridContext.DataGridControl, m_dataGridContext, m_item, detailConfiguration);
                }

                list.Add(detailDataGridContextAutomationPeer);
                m_dataChildren[detailConfiguration] = detailDataGridContextAutomationPeer;
            }

            return(list);
        }
    protected override List<AutomationPeer> GetChildrenCore()
    {
      DataRow dataRow = m_dataGridContext.CustomItemContainerGenerator.ContainerFromItem( m_item ) as DataRow;

      if( dataRow == null )
        return null;

      // Get child context ( Detail )
      DetailConfigurationCollection detailConfigurations = m_dataGridContext.DetailConfigurations;
      int detailConfigurationsCount = detailConfigurations.Count;

      ReadOnlyObservableCollection<ColumnBase> visibleColumns = m_dataGridContext.VisibleColumns;
      int visibleColumnsCount = visibleColumns.Count;

      if( visibleColumnsCount + detailConfigurationsCount <= 0 )
        return null;

      Hashtable oldDataChildren = m_dataChildren;
      List<AutomationPeer> list = new List<AutomationPeer>( visibleColumnsCount + detailConfigurationsCount );
      m_dataChildren = new Hashtable( visibleColumnsCount + detailConfigurationsCount );

      for( int i = 0; i < visibleColumnsCount; i++ )
      {
        ColumnBase column = visibleColumns[ i ];

        DataGridItemCellAutomationPeer cellAutomationPeer =
          oldDataChildren[ column ] as DataGridItemCellAutomationPeer;

        if( cellAutomationPeer == null )
          cellAutomationPeer = new DataGridItemCellAutomationPeer( this, column );

        // Always resetting the ColumnIndex since the visible position can have changed
        cellAutomationPeer.ColumnIndex = i;

        list.Add( cellAutomationPeer );
        m_dataChildren[ column ] = cellAutomationPeer;
      }

      for( int i = 0; i < detailConfigurationsCount; i++ )
      {
        DetailConfiguration detailConfiguration = detailConfigurations[ i ];
        DataGridContextAutomationPeer detailDataGridContextAutomationPeer = null;

        detailDataGridContextAutomationPeer =
          oldDataChildren[ detailConfiguration ] as DataGridContextAutomationPeer;

        if( detailDataGridContextAutomationPeer == null )
        {
          detailDataGridContextAutomationPeer = new DataGridContextAutomationPeer(
            m_dataGridContext.DataGridControl, m_dataGridContext, m_item, detailConfiguration );
        }

        list.Add( detailDataGridContextAutomationPeer );
        m_dataChildren[ detailConfiguration ] = detailDataGridContextAutomationPeer;
      }

      return list;
    }