in sources/Google.Solutions.Mvvm/Controls/BindableTreeView.cs [432:491]
private void ModelChildrenChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
AddTreeNodesForModelNodes(e.NewItems.OfType<TModelNode>());
break;
case NotifyCollectionChangedAction.Remove:
foreach (var oldModelItem in e.OldItems.OfType<TModelNode>())
{
var oldTreeNode = FindTreeNodeByModelNode(oldModelItem);
if (oldTreeNode != null)
{
this.Nodes.Remove(oldTreeNode);
oldTreeNode.Dispose();
}
}
break;
case NotifyCollectionChangedAction.Replace:
if (e.OldItems.Count == e.NewItems.Count)
{
var count = e.OldItems.Count;
for (var i = 0; i < count; i++)
{
var oldModelItem = (TModelNode)e.OldItems[i];
var newModelItem = (TModelNode)e.NewItems[i];
var treeNode = FindTreeNodeByModelNode(oldModelItem);
if (treeNode != null)
{
this.Nodes.Remove(treeNode);
treeNode.Dispose();
this.Nodes.Insert(
e.NewStartingIndex,
new Node(this.treeView, newModelItem));
}
}
}
break;
case NotifyCollectionChangedAction.Move:
// Not supported.
break;
case NotifyCollectionChangedAction.Reset:
// Reload everything.
DisposeAndClear(this.Nodes);
AddTreeNodesForModelNodes((ObservableCollection<TModelNode>)sender);
break;
default:
break;
}
}