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;
                }
            }