none
WPF TreeView mit ItemsSource - Feststellung von Unterelementen RRS feed

  • Frage

  • Hey,

    ich verwende einen TreeView mit ItemsSource. Für diese Items habe ich ein HierarchicalDataTemplate festgelegt.
    Nun rüft das TreeView beim ersten Darstellen nicht nur die Elemente ab, sondern auch all deren Children (um festzustellen, ob Unterelemente existieren).

    Da meine ChildColleciton aber zur Laufzeit erst befüllt wird, würde ich den Getter gerne erst so spät wie möglich rufen! Gibt es eine Möglichkeit, diese Methode zum feststellen ob Unterelemente existieren zu überschreiben o.Ä.?

    Meine Items haben eine boolsche Eigenschaft, ob Unterelemente existieren (würde).

    Vielen Dank!

    Tris

     

    Edit:

    Kleine Ergänung mal: Habe zu Testzwecken via ItemContainerStyle ein Style/Template festgelegt, welches die Eigenschaft "HasItems" nicht verwendet - dennoch wird der Getter gerufen.

    Mittwoch, 31. März 2010 09:24

Antworten

  • Ich kann dir nicht sagen, wie das treeView-Steuerelement intern arbeitet. Die Nutzung eines Dummy-Objektes ist ein typisches Szenario für das Windows-TreeView. Warum du dieses Szenario nicht auch in WPF nutzen kannst, kann ich aus deinen Ausführungen nicht erkennen. Ein Beispiel steht auf meiner Homepage unter:

    <Tipps und Tricks - informtools - Tipp 404>
    http://informtools.dresden-marathon.de/kb.aspx?id=404

    --
    Peter

    • Als Antwort vorgeschlagen Peter Fleischer Dienstag, 6. April 2010 05:08
    • Als Antwort markiert tris. _ Dienstag, 13. April 2010 21:20
    Dienstag, 6. April 2010 05:08

Alle Antworten

  • Wenn du mit dem Laden einer Hierarchie und der untergeordneten Elemente leben kannst, dann erzeuge die Objekte erst im getter der gebundenen Liste. Wenn dir das zu viel ist, dann schreibe im getter ein Dummy-Objekt, um anzuzeigen, dass es untergeordnete Knoten gibt. Im Expanded-Ereignis kannst du dann das Dummy-Objekt entfernen und die richtigen Objekte nachladen.

    --
    Peter

    Sonntag, 4. April 2010 19:02
  • Hey Peter,

    danke für deine Antwort. Ich lade die Unterelemente derzeit im getter, nur - wie von dir bereits beschrieben - lied das Framework immer eine Ebene "zuviel"; natürlich um festzustellen, ob Unterelemente existieren.

    Zur not würde ich mich am Expanded-Ereignis bedienen, nur ist es nicht evtl. möglich das Framework zum feststellen der Existenz von Unterelementen auf eine andere Eigenschaft zugreifen zu lassen?

    z.B.

     

    Children (als auflistung der Unterelemente)
    HasChildren (zum feststellen der Existenz)

    Montag, 5. April 2010 21:55
  • Ich kann dir nicht sagen, wie das treeView-Steuerelement intern arbeitet. Die Nutzung eines Dummy-Objektes ist ein typisches Szenario für das Windows-TreeView. Warum du dieses Szenario nicht auch in WPF nutzen kannst, kann ich aus deinen Ausführungen nicht erkennen. Ein Beispiel steht auf meiner Homepage unter:

    <Tipps und Tricks - informtools - Tipp 404>
    http://informtools.dresden-marathon.de/kb.aspx?id=404

    --
    Peter

    • Als Antwort vorgeschlagen Peter Fleischer Dienstag, 6. April 2010 05:08
    • Als Antwort markiert tris. _ Dienstag, 13. April 2010 21:20
    Dienstag, 6. April 2010 05:08
  • Hey Peter,

    danke nochmal für deine Hilfe! Aber eben um das Anpassen dieses internen Verhaltens geht es mir! Evtl von TreeView erben & eine bestimmte Methode überschreiben?

    Natürlich ist das technisch wie von dir vorgeschlagen zu realisieren! Nur ist das eben so "WinForm" ;)
    Ich würde gerne die neuen WPF-Methoden verwenden können (wie in diesem Fall eben das Binding), nur müsste ich dann das Dummy-Objekt in meine Children-Collection hängen & erst nach aufruf einer Methode (LoadChildren) verändern.

    Ich finde nur, dass so etwas im BLL GARNICHTS zu suchen hat & habe mir hier von Microsoft etwas mehr erhofft.

    Überhaupt stoße ich an allen WPF-Ecken und -Enden an techische Grenzen; eine schöne technick für ein Nachmittagsprojekt, nur sobald es "professionell" werden soll... ich kann mir nicht helfen...

    Mittwoch, 7. April 2010 21:50
  • Natürlich kannst du aich von TreeView erben und in deiner eigenen Klasse z.B. die von mir genannte Herangehensweise realisieren. Wenn du Probleme mit MS hast und wenn du eine andere Arbeitsweise eines Steuerelementes von Microsoft wünschst, dann wende dich doch direkt an Sie. Ich kann die da wenig helfen, außer Probleme über Connect zu melden. Nur bisher sehe ich kein Problem.

    In meinem Beispiel habe ich gezeigt, wie die auch in  WinForms angewandte Herangehensweise in WPF realisiert werden kann, ohne ein eigenes Steuerelement zu erstellen. Die gesamte Logik wird in meinem Beispiel ohne Codebehind der UI in der ViewModel-Klasse abgehandelt. Damit ist es problemlos möglich die Techniken der Bindung in WPF zu nutzen und Design und Programmierung vollständig zu trennen.

    Dsss du Probleme mit WPF hast, ist verständlich, da die Aneignung der vielen Möglichkeiten einen gewaltigen Lernaufwand erfordert. An vielen Stellen, muss man seine angeeigneten Herangehensweisen aus der Vergangenheit einfach nur hinterfragen, in Frage stellen und oft nur einfach ignorieren.

    --
    Peter

     

     

    Donnerstag, 8. April 2010 04:34
  • Hey Peter,

    das Problem geht etwas Hand in Hand mit dem anderen, bei dem du mir auch hilfst - hast du sicher schon bemerkt ;)

    Zur MS Implementation: Ich meinte nur, dass es doch schön wäre evtl eine Delegate-Property o.ä. zum feststellen der Unterelemente geben könnte - sodass eben nicht die ItemsSource Property (Count) gerufen werden muss.

    Nun aber zur Lösung: Hatte dein Beispiel etwas falsch verstanden, werde es mir nochmal in Ruhe ansehen und versuchen zu implementieren. Ich melde mich dann nochmal, Danke erstmal.

    Samstag, 10. April 2010 11:27
  • Du hast doch das Expanded-Ereignis. Warum du das nicht nutzen kannst, verstehe ich immer noch nicht. Ein CallBack für die Feststellung der Anzahl der untergeordneten Knoten sehe ich als nicht notwenig an. Wenn es untergeordnete Knoten gibt, dann setze den ersten Knoten oder einen Dummy-Knoten. Im Expanded-Ereignis kann man dann die Liste vervollständigen (wenn nur der erste Knoten enthalten ist) oder korrigieren (Dummy-Knoten).

    --
    Peter

     

    Samstag, 10. April 2010 18:23
  • Grundsätzlich funktioniert das natürlich - ja. Nur muss ich hierfür ein klassisches TreeViewItem "zwischenschieben" und komme nicht ausschließlich mit meiner Klasse & einem DataTemplate aus.

    Samstag, 10. April 2010 20:55
  • Wie meinst du das?

    Hast du dir mein Beispiel überhaupt angesehen? Da wird nichts "zwischengeschoben". Das ViewModel erzeugt ein Dummy-Datenobjekt, welches beim Expanded-Ereignis gegen die die richtigen Datenobjekte ausgetauscht wird. Im DataTemplate ist da nichts anzupassen oder zu berücksichtigen, da das Dummy-Datenobjekt ja nie angezeigt wird.

    --
    Peter

    Sonntag, 11. April 2010 05:30
  • Sorry, habe es tatsächlich nicht direkt geschnallt. Das Beispiel ist natürlich genau das, was ich gesucht habe.
    Habe es mal als Antwort markiert - Danke nochmal.

    Dienstag, 13. April 2010 21:21