Поддержание новой коллекции, которую все узлы добавляют / удаляют, когда изменения их ChildrenCollection кажутся наилучшими. Можно поймать событие Node's Children's CollectionChanged:
void ChildrenCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// ASSUMPTION: only one item is ever added/removed so will be at NewItems[0]/OldItems[0]
switch (e.Action)
{
case NotifyCollectionChangedAction.Add: nodes.AllChildren.Add(e.NewItems[0]);break;
case NotifyCollectionChangedAction.Remove: nodes.AllChildren.Remove(e.OldItems[0]); break;
case NotifyCollectionChangedAction.Replace:
{
int i = nodes.AllChildren.IndexOf(e.OldItems[0]);
nodes.AllChildren.RemoveAt(i);
nodes.AllChildren.Insert(i, e.NewItems[0]);
}
break;
case NotifyCollectionChangedAction.Reset:
{
nodes.AllChildren.Clear();
foreach (Node n in this.ChildrenCollection)
nodes.AllChildren.Add(n);
}
break;
// NOTE: dont't care if it moved
}
}
Где узлы - это ссылка на коллекцию верхнего уровня.
Затем вы можете привязать свой ListView.ItemsSource к AllChildren, который, если это ObervableCollection, останется в актуальном состоянии!
ПРИМЕЧАНИЕ : Если свойства в узле изменятся, они не будут отражены в коллекции AllChildren - только добавление / удаление и замена узлов в одной коллекции ChildrenCollection будут реплицироваться в коллекции AllChildren. .
ПРИМЕЧАНИЕ II : Вы должны быть осторожны, чтобы, прежде чем вы могли просто заменить узел в дереве, таким образом, чтобы выровнять всю ветку ниже, вы должны сначала удалить все глубины в этом узле. ветвь, так что "зеркальная" коллекция AllChildren тоже обновляется!