Frage

Ich habe eine TreeView, die zu einer Sammelklasse gebunden ist, dass ich keine Kontrolle haben. Innerhalb dieser Klasse ist eine Sammlung von Objekten, die jeweils ihre eigene Sammlung von Gegenständen haben. Diese Hierarchie wird bei 3 tief fixiert. Die Kinder des TreeView in einer ObservableCollection enthalten und werden in der Strukturansicht entsprechend aktualisiert. Die Sammlungen innerhalb jedes dieser Objekte sind nicht zu beobachten, und damit muss ich manuell neu binden die Daten an das TreeView jedes Mal, wenn ich hinzufügen, um ein Objekt zu einem der Kinder. Dies bewirkt, dass alle der erweiterten Kinder wieder auf einen nicht expandierten Zustand sein. Ich versuche, um die Objekte zu cachen, die erweitert wurden, so dass sie wieder ausgebreitet nach Wieder Bindung sein kann. Die Kinder arbeiten, wie ich erwarten würde, aber wenn ich versuche, einen Enkel des TreeView ich zu erweitern, um ein Null-Objekt bekommen.

Um ein TreeViewItem Ich verwende die ItemContainerGenerator Eigenschaft des Items zu erhalten:

TreeViewItem cfItem = treeView.ItemContainerGenerator
    .ContainerFromItem(obj) as TreeViewItem;
cfItem.IsExpanded = true;

Die zweite Ebene Sammlungen haben alle einen Verweis auf ihr übergeordnetes Objekt. So, da ich viele dieser Aufgabe haben, werden sie geschlungen über und jeder benutzt es das übergeordnete Objekt der TreeViewItem von seinen Eltern zu finden. Die Reihenfolge, in der sie auf die Sammlung Garantien hinzugefügt (glaube ich), dass die Kinder immer nach der Mutter verarbeitet werden. So erhalte ich diese hässliche Codezeile:

qualItem = (
    (TreeViewItem)treeView.ItemContainerGenerator
        .ContainerFromItem(
            ((Child)obj).ParentObject
        )
    )
    .ItemContainerGenerator.ContainerFromItem(obj) as TreeViewItem;

Diese Zeile nicht immer, wenn er versucht, den Behälter von Artikeln obj zu erhalten. Es wird erfolgreich die Eltern TreeViewItem, aber bei dem Versuch, die Kinder TreeViewItem Behälter zu bekommen, habe ich immer null erhalten. Die Dokumentation besagt, dass ContainerFromItem () zurückkehrt

  

"A System.Windows.UIElement dass   entspricht den gegebenen Punkt. Kehrt zurück   null, wenn der Artikel gehört nicht zu   die Artikel-Sammlung, oder wenn ein   System.Windows.UIElement ist nicht   erzeugt für sie. "

Ich weiß, dass die zweite Ebene Kind in der Artikelsammlung der Eltern besteht. Ich habe im Debugger in VS 2010, und alle Elemente sind da. Ich verbrachte ein gutes Stück Zeit auf Google Suche nach einer Antwort und kam über jemanden, der sagte, dass die Container Elemente auf einem Hintergrund-Worker-Thread erstellt werden und nicht wird erzeugt werden können, durch die Zeit, ein Versuch, die Kind Elementcontainer zu bekommen. Ich habe versucht, warte auf die Status-Eigenschaft des ItemContainerGenerator zu GeneratorStatus.ContainersGenerated gleich zu sein, aber ich habe immer noch das gleiche Ergebnis. Ich muss irgendwie die TreeViewItem Behälter für meine zweite Ebene Kinder bekommen, so dass sie wieder ausgebreitet wie die erste Stufe Kinder sein kann.

War es hilfreich?

Lösung 2

Die Lösung ist eine weitere Abstraktionsebene zwischen den Daten und dem TreeView hinzuzufügen. Die Top-Level-Sammlung ist eine ObservableCollection, und das enthält mehrere Viewmodels, die INotifyPropertyChanged implementieren und haben auch ObservableCollections von Elementen, die unter ihm in dem Baum sind. Dieses System ermöglicht WPF leichter binden und zu verfolgen, die Elemente, die hinzugefügt und gelöscht werden.

Meine wichtigste Informationsquelle war dieser Artikel:

http://msdn.microsoft.com/en-us/magazine /dd419663.aspx

Andere Tipps

  

"A System.Windows.UIElement, dass entspricht den gegebenen Punkt. Gibt null zurück, wenn das Element nicht, gehört in der Artikel-Sammlung, oder , wenn ein System.Windows.UIElement wurde es nicht erzeugt . "

Sieht aus wie wegen Virtualization, die UIElement Sie suchen ist nicht vorhanden, wenn Sie danach suchen. Wenn die Sammlung nicht zu groß ist, versuchen Sie die Virtualization ausschalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top