IRawElementProviderSimple[] ISelectionProvider.GetSelection()
        {
            EnsureEnabled();

            if (this.OwningDataGrid != null &&
                this.OwningDataGridPeer != null &&
                this.OwningDataGrid.SelectedItems != null &&
                _group.ItemCount > 0)
            {
                DataGridRowGroupInfo groupInfo = this.OwningDataGrid.RowGroupInfoFromCollectionViewGroup(_group);
                if (groupInfo != null)
                {
                    // See which of the selected items are contained within this group
                    List <IRawElementProviderSimple> selectedProviders = new List <IRawElementProviderSimple>();
                    int startRowIndex = groupInfo.Slot - this.OwningDataGrid.RowGroupHeadersTable.GetIndexCount(0, groupInfo.Slot) + 1;
                    foreach (object item in this.OwningDataGrid.GetSelectionInclusive(startRowIndex, startRowIndex + _group.ItemCount - 1))
                    {
                        DataGridItemAutomationPeer peer = this.OwningDataGridPeer.GetOrCreateItemPeer(item);
                        if (peer != null)
                        {
                            selectedProviders.Add(ProviderFromPeer(peer));
                        }
                    }
                    return(selectedProviders.ToArray());
                }
            }
            return(null);
        }
Exemple #2
0
        internal DataGridItemAutomationPeer GetOrCreateItemPeer(object item)
        {
            DataGridItemAutomationPeer peer = null;

            if (item != null)
            {
                if (_itemPeers.ContainsKey(item))
                {
                    peer = _itemPeers[item];
                }
                else
                {
                    peer = new DataGridItemAutomationPeer(item, this.OwningDataGrid);
                    _itemPeers.Add(item, peer);
                }

                DataGridRowAutomationPeer rowPeer = peer.OwningRowPeer;
                if (rowPeer != null)
                {
                    rowPeer.EventsSource = peer;
                }
            }

            return(peer);
        }
Exemple #3
0
        internal void RaiseAutomationInvokeEvents(DataGridEditingUnit editingUnit, DataGridColumn column, DataGridRow row)
        {
            switch (editingUnit)
            {
            case DataGridEditingUnit.Cell:
            {
                DataGridCell   cell = row.Cells[column.Index];
                AutomationPeer peer = FromElement(cell);
                if (peer != null)
                {
                    peer.InvalidatePeer();
                }
                else
                {
                    peer = CreatePeerForElement(cell);
                }

                if (peer != null)
                {
                    peer.RaiseAutomationEvent(AutomationEvents.InvokePatternOnInvoked);
                }
                break;
            }

            case DataGridEditingUnit.Row:
            {
                DataGridItemAutomationPeer peer = GetOrCreateItemPeer(row.DataContext);
                peer.RaiseAutomationEvent(AutomationEvents.InvokePatternOnInvoked);
                break;
            }
            }
        }
        // Token: 0x06002604 RID: 9732 RVA: 0x000B5F50 File Offset: 0x000B4150
        protected override List <AutomationPeer> GetChildrenCore()
        {
            DataGridCellsPresenter cellsPresenter = this.OwningDataGridRow.CellsPresenter;

            if (cellsPresenter != null && cellsPresenter.ItemsHost != null)
            {
                List <AutomationPeer> list = new List <AutomationPeer>(3);
                AutomationPeer        rowHeaderAutomationPeer = this.RowHeaderAutomationPeer;
                if (rowHeaderAutomationPeer != null)
                {
                    list.Add(rowHeaderAutomationPeer);
                }
                DataGridItemAutomationPeer dataGridItemAutomationPeer = base.EventsSource as DataGridItemAutomationPeer;
                if (dataGridItemAutomationPeer != null)
                {
                    list.AddRange(dataGridItemAutomationPeer.GetCellItemPeers());
                }
                AutomationPeer detailsPresenterAutomationPeer = this.DetailsPresenterAutomationPeer;
                if (detailsPresenterAutomationPeer != null)
                {
                    list.Add(detailsPresenterAutomationPeer);
                }
                return(list);
            }
            return(base.GetChildrenCore());
        }
        override internal void AddToParentProxyWeakRefCache()
        {
            DataGridItemAutomationPeer owningItemPeer = this.OwningItemPeer;

            if (owningItemPeer != null)
            {
                owningItemPeer.AddProxyToWeakRefStorage(this.ElementProxyWeakReference, this);
            }
        }
        // This method is called from DataGrid.OnBeginningEdit/OnCommittingEdit/OnCancelingEdit
        // Raises Invoked event when row begin/cancel/commit edit
        internal void RaiseAutomationRowInvokeEvents(DataGridRow row)
        {
            DataGridItemAutomationPeer dataGridItemAutomationPeer = FindOrCreateItemAutomationPeer(row.Item) as DataGridItemAutomationPeer;

            if (dataGridItemAutomationPeer != null)
            {
                dataGridItemAutomationPeer.RaiseAutomationEvent(AutomationEvents.InvokePatternOnInvoked);
            }
        }
 // Token: 0x06002577 RID: 9591 RVA: 0x000B4338 File Offset: 0x000B2538
 private DataGridCellItemAutomationPeer GetCellItemPeer(DataGridCellInfo cellInfo)
 {
     if (cellInfo.IsValid)
     {
         DataGridItemAutomationPeer dataGridItemAutomationPeer = this.FindOrCreateItemAutomationPeer(cellInfo.Item) as DataGridItemAutomationPeer;
         if (dataGridItemAutomationPeer != null)
         {
             return(dataGridItemAutomationPeer.GetOrCreateCellItemPeer(cellInfo.Column));
         }
     }
     return(null);
 }
        // This method is called from DataGrid.OnBeginningEdit/OnCommittingEdit/OnCancelingEdit
        // Raises Invoked event when cell begin/cancel/commit edit
        internal void RaiseAutomationCellInvokeEvents(DataGridColumn column, DataGridRow row)
        {
            DataGridItemAutomationPeer dataGridItemAutomationPeer = FindOrCreateItemAutomationPeer(row.Item) as DataGridItemAutomationPeer;

            if (dataGridItemAutomationPeer != null)
            {
                DataGridCellItemAutomationPeer cellPeer = dataGridItemAutomationPeer.GetOrCreateCellItemPeer(column);
                if (cellPeer != null)
                {
                    cellPeer.RaiseAutomationEvent(AutomationEvents.InvokePatternOnInvoked);
                }
            }
        }
Exemple #9
0
 IRawElementProviderSimple[] ISelectionProvider.GetSelection()
 {
     if (this.OwningDataGrid != null &&
         this.OwningDataGrid.SelectedItems != null)
     {
         List <IRawElementProviderSimple> selectedProviders = new List <IRawElementProviderSimple>();
         foreach (object item in this.OwningDataGrid.SelectedItems)
         {
             DataGridItemAutomationPeer peer = GetOrCreateItemPeer(item);
             selectedProviders.Add(ProviderFromPeer(peer));
         }
         return(selectedProviders.ToArray());
     }
     return(null);
 }
Exemple #10
0
        internal void RaiseAutomationSelectionEvents(SelectionChangedEventArgs e)
        {
            // If the result of an AddToSelection or RemoveFromSelection is a single selected item,
            // then all we raise is the ElementSelectedEvent for single item
            if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementSelected) &&
                this.OwningDataGrid.SelectedItems.Count == 1)
            {
                if (this.OwningDataGrid.SelectedItem != null && _itemPeers.ContainsKey(this.OwningDataGrid.SelectedItem))
                {
                    DataGridItemAutomationPeer peer = _itemPeers[this.OwningDataGrid.SelectedItem];
                    peer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementSelected);
                }
            }
            else
            {
                int i;

                if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementAddedToSelection))
                {
                    for (i = 0; i < e.AddedItems.Count; i++)
                    {
                        if (e.AddedItems[i] != null && _itemPeers.ContainsKey(e.AddedItems[i]))
                        {
                            DataGridItemAutomationPeer peer = _itemPeers[e.AddedItems[i]];
                            peer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementAddedToSelection);
                        }
                    }
                }

                if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection))
                {
                    for (i = 0; i < e.RemovedItems.Count; i++)
                    {
                        if (e.RemovedItems[i] != null && _itemPeers.ContainsKey(e.RemovedItems[i]))
                        {
                            DataGridItemAutomationPeer peer = _itemPeers[e.RemovedItems[i]];
                            peer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection);
                        }
                    }
                }
            }
        }
 /// <summary>Retrieves the UI Automation provider for the specified cell.</summary>
 /// <param name="row">The ordinal number of the row of interest.</param>
 /// <param name="column">The ordinal number of the column of interest.</param>
 /// <returns>The UI Automation provider for the specified cell.</returns>
 // Token: 0x0600256F RID: 9583 RVA: 0x000B40E0 File Offset: 0x000B22E0
 IRawElementProviderSimple IGridProvider.GetItem(int row, int column)
 {
     if (row >= 0 && row < this.OwningDataGrid.Items.Count && column >= 0 && column < this.OwningDataGrid.Columns.Count)
     {
         object         item    = this.OwningDataGrid.Items[row];
         DataGridColumn column2 = this.OwningDataGrid.Columns[column];
         this.OwningDataGrid.ScrollIntoView(item, column2);
         this.OwningDataGrid.UpdateLayout();
         DataGridItemAutomationPeer dataGridItemAutomationPeer = this.FindOrCreateItemAutomationPeer(item) as DataGridItemAutomationPeer;
         if (dataGridItemAutomationPeer != null)
         {
             DataGridCellItemAutomationPeer orCreateCellItemPeer = dataGridItemAutomationPeer.GetOrCreateCellItemPeer(column2);
             if (orCreateCellItemPeer != null)
             {
                 return(base.ProviderFromPeer(orCreateCellItemPeer));
             }
         }
     }
     return(null);
 }
 /// <summary>Retrieves a collection of UI Automation providers representing all the row headers associated with a table item or cell.</summary>
 /// <returns>A collection of UI Automation providers. </returns>
 // Token: 0x060025A7 RID: 9639 RVA: 0x000B4CE0 File Offset: 0x000B2EE0
 IRawElementProviderSimple[] ITableItemProvider.GetRowHeaderItems()
 {
     if (this.OwningDataGrid != null && (this.OwningDataGrid.HeadersVisibility & DataGridHeadersVisibility.Row) == DataGridHeadersVisibility.Row)
     {
         DataGridAutomationPeer     dataGridAutomationPeer     = UIElementAutomationPeer.CreatePeerForElement(this.OwningDataGrid) as DataGridAutomationPeer;
         DataGridItemAutomationPeer dataGridItemAutomationPeer = dataGridAutomationPeer.FindOrCreateItemAutomationPeer(this.Item) as DataGridItemAutomationPeer;
         if (dataGridItemAutomationPeer != null)
         {
             AutomationPeer rowHeaderAutomationPeer = dataGridItemAutomationPeer.RowHeaderAutomationPeer;
             if (rowHeaderAutomationPeer != null)
             {
                 return(new List <IRawElementProviderSimple>(1)
                 {
                     base.ProviderFromPeer(rowHeaderAutomationPeer)
                 }.ToArray());
             }
         }
     }
     return(null);
 }
Exemple #13
0
        internal void PopulateItemPeers()
        {
            Dictionary <object, DataGridItemAutomationPeer> oldChildren = new Dictionary <object, DataGridItemAutomationPeer>(_itemPeers);

            _itemPeers.Clear();

            if (this.OwningDataGrid.ItemsSource != null)
            {
                foreach (object item in this.OwningDataGrid.ItemsSource)
                {
                    if (item != null)
                    {
                        DataGridItemAutomationPeer peer = null;

                        if (oldChildren.ContainsKey(item))
                        {
                            peer = oldChildren[item] as DataGridItemAutomationPeer;
                        }
                        else
                        {
                            peer = new DataGridItemAutomationPeer(item, this.OwningDataGrid);
                        }

                        if (peer != null)
                        {
                            DataGridRowAutomationPeer rowPeer = peer.OwningRowPeer;
                            if (rowPeer != null)
                            {
                                rowPeer.EventsSource = peer;
                            }
                        }

                        // This guards against the addition of duplicate items
                        if (!_itemPeers.ContainsKey(item))
                        {
                            _itemPeers.Add(item, peer);
                        }
                    }
                }
            }
        }
 /// <summary>Retrieves a collection of UI Automation providers that represents all row headers in the table.</summary>
 /// <returns>A collection of UI Automation providers.</returns>
 // Token: 0x06002575 RID: 9589 RVA: 0x000B4284 File Offset: 0x000B2484
 IRawElementProviderSimple[] ITableProvider.GetRowHeaders()
 {
     if ((this.OwningDataGrid.HeadersVisibility & DataGridHeadersVisibility.Row) == DataGridHeadersVisibility.Row)
     {
         List <IRawElementProviderSimple> list = new List <IRawElementProviderSimple>();
         foreach (object item in ((IEnumerable)this.OwningDataGrid.Items))
         {
             DataGridItemAutomationPeer dataGridItemAutomationPeer = this.FindOrCreateItemAutomationPeer(item) as DataGridItemAutomationPeer;
             AutomationPeer             rowHeaderAutomationPeer    = dataGridItemAutomationPeer.RowHeaderAutomationPeer;
             if (rowHeaderAutomationPeer != null)
             {
                 list.Add(base.ProviderFromPeer(rowHeaderAutomationPeer));
             }
         }
         if (list.Count > 0)
         {
             return(list.ToArray());
         }
     }
     return(null);
 }
Exemple #15
0
        ///
        protected override List <AutomationPeer> GetChildrenCore()
        {
            // see whether the DataGridRow uses the standard control template
            DataGridCellsPresenter cellsPresenter = OwningDataGridRow.CellsPresenter;

            if (cellsPresenter != null && cellsPresenter.ItemsHost != null)
            {
                // this is the normal case
                List <AutomationPeer> children = new List <AutomationPeer>(3);

                // Step 1: Add row header if exists
                AutomationPeer dataGridRowHeaderAutomationPeer = RowHeaderAutomationPeer;
                if (dataGridRowHeaderAutomationPeer != null)
                {
                    children.Add(dataGridRowHeaderAutomationPeer);
                }

                // Step 2: Add all cells
                DataGridItemAutomationPeer itemPeer = this.EventsSource as DataGridItemAutomationPeer;
                if (itemPeer != null)
                {
                    children.AddRange(itemPeer.GetCellItemPeers());
                }

                // Step 3: Add DetailsPresenter last if exists
                AutomationPeer dataGridDetailsPresenterAutomationPeer = DetailsPresenterAutomationPeer;
                if (dataGridDetailsPresenterAutomationPeer != null)
                {
                    children.Add(dataGridDetailsPresenterAutomationPeer);
                }

                return(children);
            }
            else
            {
                // in the unusual case where the app uses a non-standard control template
                // for the DataGridRow, fall back to the base implementation
                return(base.GetChildrenCore());
            }
        }
 // Token: 0x0600257C RID: 9596 RVA: 0x000B4578 File Offset: 0x000B2778
 private void AddSelectedCells(List <IRawElementProviderSimple> cellProviders)
 {
     if (cellProviders == null)
     {
         throw new ArgumentNullException("cellProviders");
     }
     if (this.OwningDataGrid.SelectedCells != null)
     {
         foreach (DataGridCellInfo dataGridCellInfo in this.OwningDataGrid.SelectedCells)
         {
             DataGridItemAutomationPeer dataGridItemAutomationPeer = this.FindOrCreateItemAutomationPeer(dataGridCellInfo.Item) as DataGridItemAutomationPeer;
             if (dataGridItemAutomationPeer != null)
             {
                 IRawElementProviderSimple rawElementProviderSimple = base.ProviderFromPeer(dataGridItemAutomationPeer.GetOrCreateCellItemPeer(dataGridCellInfo.Column));
                 if (rawElementProviderSimple != null)
                 {
                     cellProviders.Add(rawElementProviderSimple);
                 }
             }
         }
     }
 }
        private void AddSelectedCells(List <IRawElementProviderSimple> cellProviders)
        {
            if (cellProviders == null)
            {
                throw new ArgumentNullException("cellProviders");
            }

            // Add selected cells to selection
            if (this.OwningDataGrid.SelectedCells != null)
            {
                foreach (DataGridCellInfo cellInfo in this.OwningDataGrid.SelectedCells)
                {
                    DataGridItemAutomationPeer itemPeer = this.FindOrCreateItemAutomationPeer(cellInfo.Item) as DataGridItemAutomationPeer;
                    if (itemPeer != null)
                    {
                        IRawElementProviderSimple provider = ProviderFromPeer(itemPeer.GetOrCreateCellItemPeer(cellInfo.Column));
                        if (provider != null)
                        {
                            cellProviders.Add(provider);
                        }
                    }
                }
            }
        }
        public void DataGridItem_IScrollItemProvider()
        {
            List<Customer> boundList = CreateCustomerList(25);
            DataGrid dataGrid = new DataGrid();
            Assert.IsNotNull(dataGrid);
            isLoaded = false;
            dataGrid.Width = 350;
            dataGrid.Height = 250;
            dataGrid.Loaded += new RoutedEventHandler(dataGrid_Loaded);
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = boundList;
            dataGrid.ColumnWidth = new DataGridLength(100.0);

            TestPanel.Children.Add(dataGrid);
            EnqueueConditional(delegate { return isLoaded; });
            this.EnqueueYieldThread();

            AutomationPeer peer;
            IScrollItemProvider scrollItem;

            int index = boundList.Count;
            for (int i = 0; i < boundList.Count; i++)
            {
                EnqueueCallback(delegate
                {
                    index--;
                    peer = new DataGridItemAutomationPeer(boundList[index], dataGrid);
                    Assert.IsNotNull(peer);
                    scrollItem = peer.GetPattern(PatternInterface.ScrollItem) as IScrollItemProvider;
                    Assert.IsNotNull(scrollItem);
                    scrollItem.ScrollIntoView();
                });
                this.EnqueueYieldThread();

                EnqueueCallback(delegate
                {
                    Assert.IsTrue(dataGrid.IsSlotVisible(dataGrid.SlotFromRowIndex(index)));
                });
            }
            EnqueueTestComplete();
        }
        public void DataGridItem_IInvokeProvider()
        {
            List<Customer> boundList = CreateCustomerList(5);
            DataGrid dataGrid = new DataGrid();
            Assert.IsNotNull(dataGrid);
            isLoaded = false;
            dataGrid.Width = 200;
            dataGrid.Height = 250;
            dataGrid.Loaded += new RoutedEventHandler(dataGrid_Loaded);
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = boundList;

            TestPanel.Children.Add(dataGrid);
            EnqueueConditional(delegate { return isLoaded; });
            this.EnqueueYieldThread();

            AutomationPeer peer;
            IInvokeProvider invoker;

            int index = 0;
            for (int i = 0; i < boundList.Count; i++)
            {
                EnqueueCallback(delegate
                {
                    Assert.IsNull(dataGrid.EditingRow);
                    Assert.AreEqual(-1, dataGrid.EditingColumnIndex);

                    peer = new DataGridItemAutomationPeer(boundList[index], dataGrid);
                    Assert.IsNotNull(peer);
                    invoker = (IInvokeProvider)peer.GetPattern(PatternInterface.Invoke);
                    Assert.IsNotNull(invoker);

                    invoker.Invoke();
                });
                this.EnqueueYieldThread();

                EnqueueCallback(delegate
                {
                    Assert.AreEqual(0, dataGrid.EditingColumnIndex);
                    Assert.IsNotNull(dataGrid.EditingRow);
                    Assert.AreEqual(index, dataGrid.EditingRow.Index);

                    peer = new DataGridItemAutomationPeer(boundList[index], dataGrid);
                    Assert.IsNotNull(peer);
                    invoker = (IInvokeProvider)peer.GetPattern(PatternInterface.Invoke);
                    Assert.IsNotNull(invoker);

                    invoker.Invoke();
                    index++;
                });
                this.EnqueueYieldThread();

                EnqueueCallback(delegate
                {
                    Assert.IsNull(dataGrid.EditingRow);
                    Assert.AreEqual(-1, dataGrid.EditingColumnIndex);
                });
            }
            EnqueueTestComplete();
        }
        public void DataGridItem_AutomationPeer()
        {
            List<Customer> boundList = CreateCustomerList(1);
            DataGrid dataGrid = new DataGrid();
            Assert.IsNotNull(dataGrid);
            isLoaded = false;
            dataGrid.Width = 350;
            dataGrid.Height = 250;
            dataGrid.Loaded += new RoutedEventHandler(dataGrid_Loaded);
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = boundList;

            TestPanel.Children.Add(dataGrid);
            EnqueueConditional(delegate { return isLoaded; });
            this.EnqueueYieldThread();

            EnqueueCallback(delegate
            {
                AutomationPeer peer = new DataGridItemAutomationPeer(boundList[0], dataGrid);
                Assert.IsNotNull(peer);
                Assert.AreEqual(AutomationControlType.DataItem, peer.GetAutomationControlType(), "Incorrect ControlType value");
                Assert.AreEqual(true, peer.IsContentElement(), "Incorrect IsContentElement value");
                Assert.AreEqual(true, peer.IsControlElement(), "Incorrect IsControlElement value");
                Assert.AreEqual(false, peer.IsKeyboardFocusable(), "Incorrect IsKeyBoardFocusable value");
                Assert.AreEqual(boundList[0].ToString(), peer.GetName(), "Incorrect Name value");
                Assert.IsNotNull(peer.GetChildren(), "GetChildren should never return null");
            });

            EnqueueTestComplete();
        }
        public void DataGridGroupItem_ISelectionProvider()
        {
            PagedCollectionView customers = CreateGroupedCustomerCollectionView();
            DataGrid dataGrid = new DataGrid();
            Assert.IsNotNull(dataGrid);
            isLoaded = false;
            dataGrid.Width = 350;
            dataGrid.Height = 250;
            dataGrid.Loaded += new RoutedEventHandler(dataGrid_Loaded);
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = customers;

            TestPanel.Children.Add(dataGrid);
            EnqueueConditional(delegate { return isLoaded; });
            this.EnqueueYieldThread();

            AutomationPeer peer;
            ISelectionProvider selector = null;
            TestPeer testPeer = new TestPeer(dataGrid);

            EnqueueCallback(delegate
            {
                CollectionViewGroup group = customers.Groups[1] as CollectionViewGroup;
                Assert.IsNotNull(group, "PagedCollectionView did not return CollectionViewGroup");
                peer = new DataGridGroupItemAutomationPeer(group, dataGrid);
                Assert.IsNotNull(peer);
                selector = peer.GetPattern(PatternInterface.Selection) as ISelectionProvider;
                Assert.IsNotNull(selector);
                Assert.AreEqual(0, selector.GetSelection().Length, "There should not be any selected items within this group");

                // Select an item within group 1
                peer = new DataGridItemAutomationPeer(customers[3], dataGrid);
                Assert.IsNotNull(peer);
                ISelectionItemProvider selectionItem = peer.GetPattern(PatternInterface.SelectionItem) as ISelectionItemProvider;
                Assert.IsNotNull(selectionItem);
                selectionItem.AddToSelection();
            });
            this.EnqueueYieldThread();

            EnqueueCallback(delegate
            {
                Assert.IsNotNull(selector);
                Assert.AreEqual(1, selector.GetSelection().Length, "There should be a single selected item within this group");
                peer = testPeer.GetPeerFromProvider(selector.GetSelection()[0]);
                Assert.AreEqual(typeof(DataGridRow).Name, peer.GetClassName(), "GetSelection did not return DataGridRow");
            });
            this.EnqueueYieldThread();

            EnqueueTestComplete();
        }
        internal void PopulateItemPeers()
        {
            Dictionary<object, DataGridItemAutomationPeer> oldChildren = new Dictionary<object, DataGridItemAutomationPeer>(_itemPeers);
            _itemPeers.Clear();

            if (this.OwningDataGrid.ItemsSource != null)
            {
                foreach (object item in this.OwningDataGrid.ItemsSource)
                {
                    if (item != null)
                    {
                        DataGridItemAutomationPeer peer = null;

                        if (oldChildren.ContainsKey(item))
                        {
                            peer = oldChildren[item] as DataGridItemAutomationPeer;
                        }
                        else
                        {
                            peer = new DataGridItemAutomationPeer(item, this.OwningDataGrid);
                        }

                        if (peer != null)
                        {
                            DataGridRowAutomationPeer rowPeer = peer.OwningRowPeer;
                            if (rowPeer != null)
                            {
                                rowPeer.EventsSource = peer;
                            }
                        }

                        // This guards against the addition of duplicate items
                        if (!_itemPeers.ContainsKey(item))
                        {
                            _itemPeers.Add(item, peer);
                        }
                    }
                }
            }
        }
        public void DataGridItem_ISelectionItemProvider()
        {
            List<Customer> boundList = CreateCustomerList(5);
            DataGrid dataGrid = new DataGrid();
            Assert.IsNotNull(dataGrid);
            isLoaded = false;
            dataGrid.Width = 350;
            dataGrid.Height = 250;
            dataGrid.Loaded += new RoutedEventHandler(dataGrid_Loaded);
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = boundList;
            dataGrid.ColumnWidth = new DataGridLength(100.0);

            TestPanel.Children.Add(dataGrid);
            EnqueueConditional(delegate { return isLoaded; });
            this.EnqueueYieldThread();

            List<DataGridRow> rows = new List<DataGridRow>();
            AutomationPeer peer;
            List<ISelectionItemProvider> selectionItems = new List<ISelectionItemProvider>();

            EnqueueCallback(delegate
            {
                for (int i = 0; i < boundList.Count; i++)
                {
                    rows.Add(dataGrid.GetRowFromItem(boundList[i]));
                    peer = new DataGridItemAutomationPeer(boundList[i], dataGrid);
                    Assert.IsNotNull(peer);
                    selectionItems.Add(peer.GetPattern(PatternInterface.SelectionItem) as ISelectionItemProvider);
                    Assert.IsNotNull(selectionItems[i]);
                    selectionItems[i].AddToSelection();
                }
            });
            this.EnqueueYieldThread();

            EnqueueCallback(delegate
            {
                foreach (DataGridRow row in rows)
                {
                    Assert.IsTrue(row.IsSelected);
                }

                foreach (ISelectionItemProvider select in selectionItems)
                {
                    select.RemoveFromSelection();
                }
            });
            this.EnqueueYieldThread();

            EnqueueCallback(delegate
            {
                foreach (DataGridRow row in rows)
                {
                    Assert.IsFalse(row.IsSelected);
                }

                selectionItems[0].Select();
                selectionItems[3].Select();
                selectionItems[3].Select();
            });
            this.EnqueueYieldThread();

            EnqueueCallback(delegate
            {
                Assert.IsFalse(rows[0].IsSelected);
                Assert.IsTrue(rows[3].IsSelected);

                dataGrid.SelectionMode = DataGridSelectionMode.Single;
                selectionItems[4].AddToSelection();
                // 






            });
            this.EnqueueYieldThread();

            EnqueueCallback(delegate
            {
                Assert.IsFalse(rows[2].IsSelected);
                Assert.IsTrue(rows[4].IsSelected);
            });

            EnqueueTestComplete();
        }
        public void DataGridItem_ISelectionProvider()
        {
            List<Customer> boundList = CreateCustomerList(5);
            DataGrid dataGrid = new DataGrid();
            Assert.IsNotNull(dataGrid);
            isLoaded = false;
            dataGrid.Width = 350;
            dataGrid.Height = 250;
            dataGrid.Loaded += new RoutedEventHandler(dataGrid_Loaded);
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = boundList;
            dataGrid.ColumnWidth = new DataGridLength(100.0);

            TestPanel.Children.Add(dataGrid);
            EnqueueConditional(delegate { return isLoaded; });
            this.EnqueueYieldThread();

            AutomationPeer peer;
            ISelectionProvider selector;
            TestPeer testPeer = new TestPeer(dataGrid);

            EnqueueCallback(delegate
            {
                peer = new DataGridItemAutomationPeer(boundList[0], dataGrid);
                Assert.IsNotNull(peer);
                selector = peer.GetPattern(PatternInterface.Selection) as ISelectionProvider;
                Assert.IsNotNull(selector);
                Assert.AreEqual(1, selector.GetSelection().Length);
                peer = testPeer.GetPeerFromProvider(selector.GetSelection()[0]);
                Assert.AreEqual(typeof(DataGridCell).Name, peer.GetClassName(), "GetSelection did not return DataGridCell");
            });
            this.EnqueueYieldThread();

            EnqueueTestComplete();
        }
        internal DataGridItemAutomationPeer GetOrCreateItemPeer(object item)
        {
            DataGridItemAutomationPeer peer = null;

            if (item != null)
            {
                if (_itemPeers.ContainsKey(item))
                {
                    peer = _itemPeers[item];
                }
                else
                {
                    peer = new DataGridItemAutomationPeer(item, this.OwningDataGrid);
                    _itemPeers.Add(item, peer);
                }

                DataGridRowAutomationPeer rowPeer = peer.OwningRowPeer;
                if (rowPeer != null)
                {
                    rowPeer.EventsSource = peer;
                }
            }

            return peer;
        }