protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
if (e == null)
{
throw new ArgumentNullException("e");
}
base.OnItemsChanged(e);
HasItems = Items.Count > 0;
// Associate any TreeViewItems with their parent
if (e.NewItems != null)
{
foreach (TreeViewItem item in e.NewItems.OfType<TreeViewItem>())
{
item.ParentItemsControl = this;
}
}
TreeView parentTreeView = null;
switch (e.Action)
{
case NotifyCollectionChangedAction.Remove:
case NotifyCollectionChangedAction.Reset:
if (!ContainsSelection)
{
break;
}
parentTreeView = ParentTreeView;
if (parentTreeView == null || parentTreeView.IsSelectedContainerHookedUp)
{
break;
}
ContainsSelection = false;
Select(true);
break;
case NotifyCollectionChangedAction.Replace:
if (!ContainsSelection)
{
break;
}
parentTreeView = ParentTreeView;
if (parentTreeView == null)
{
break;
}
object selectedItem = parentTreeView.SelectedItem;
if (selectedItem == null || (e.OldItems != null && !object.Equals(selectedItem, e.OldItems[0])))
{
break;
}
parentTreeView.ChangeSelection(selectedItem, parentTreeView.SelectedContainer, false);
break;
}
// Remove the association with the Parent ItemsControl
if (e.OldItems != null)
{
foreach (TreeViewItem item in e.OldItems.OfType<TreeViewItem>())
{
item.ParentItemsControl = null;
}
}
}