protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) { // avoid reentrancy during internal updates if (_internalUpdate) { return; } _internalUpdate = true; try { // when a UIElement is added, replace it with its degenerate sibling if (visualAdded != null) { Debug.Assert(!(visualAdded is DegenerateSibling), "Unexpected addition of degenerate... All degenerates should be added during internal updates."); UIElement element = visualAdded as UIElement; DegenerateSibling sibling = new DegenerateSibling(element); int index = _owner.BaseIndexOf(element); _owner.BaseRemoveAt(index); _owner.BaseInsert(index, sibling); if (element != null) { _owner._degenerateSiblings[element] = sibling; _owner._elements.Insert(index, element); _owner.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, element, index); } } // when a degenerate sibling is removed, remove its corresponding element if (visualRemoved != null) { Debug.Assert(visualRemoved is DegenerateSibling, "Unexpected removal of UIElement... All non degenerates should be removed during internal updates."); DegenerateSibling sibling = visualRemoved as DegenerateSibling; int index = _owner._elements.IndexOf(sibling.Element); _owner._elements.RemoveAt(index); _owner.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, sibling.Element, index); _owner._degenerateSiblings.Remove(sibling.Element); } } finally { _internalUpdate = false; } }
protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) { // avoid reentrancy during internal updates if (_internalUpdate) return; _internalUpdate = true; try { // when a UIElement is added, replace it with its degenerate sibling if (visualAdded != null) { Debug.Assert(!(visualAdded is DegenerateSibling), "Unexpected addition of degenerate... All degenerates should be added during internal updates."); var element = visualAdded as UIElement; var sibling = new DegenerateSibling(element); int index = _owner.BaseIndexOf(element); _owner.BaseRemoveAt(index); _owner.BaseInsert(index, sibling); if (element != null) { _owner._degenerateSiblings[element] = sibling; _owner._elements.Insert(index, element); _owner.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, element, index); } } // when a degenerate sibling is removed, remove its corresponding element if (visualRemoved != null) { Debug.Assert(visualRemoved is DegenerateSibling, "Unexpected removal of UIElement... All non degenerates should be removed during internal updates."); var sibling = (DegenerateSibling)visualRemoved; int index = _owner._elements.IndexOf(sibling.Element); _owner._elements.RemoveAt(index); _owner.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, sibling.Element, index); _owner._degenerateSiblings.Remove(sibling.Element); } } finally { _internalUpdate = false; } }