Announcement

Collapse
No announcement yet.

[WPF] TreeViewItem selektieren aus Code heraus

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [WPF] TreeViewItem selektieren aus Code heraus

    Moin,

    Wieder mal hänge ich an einer Sache, die zwar zu Hauf im Internet diskutiert wurde, aber nicht so funktioniert, wie ich es erwarte bzw. mir wünsche.

    Ich habe eine TreeView, in der sich Childs auf mehreren Ebenen befinden.
    Nun möchte ich aus einem Click-Event heraus einen bestimmten Eintrag selektieren. Die TreeView soll den Pfad dahin dann auch visuell anzeigen, also die Parents quasi öffnen.

    Da ich hier im Forum keine Bilder einbetten kann, verlinke ich mal kurz einen Ausschnitt des TreeView: TreeView
    Den TreeViewItems habe ich im Tag-Attribut ihre ID hinterlegt, um nicht auf den Namen vergleichen zu müssen. Denn es kann zu gleich benannten Items in anderen Hierarchien kommen.

    Wenn ich nun die ID bspw. 317 habe, dann befindet sich das Item mit dieser ID im Tag irgendwo auf der dritten Ebene.
    Ich möchte nun dass dieses Item selektiert und die TreeView entsprechend geöffnet wird.

    Wie gesagt, ich habe eine Menge im Netz gefunden, aber keine Lösung davon hat mit etwas angezeigt.
    Viele Möglichkeiten sind auch schon allein deshalb durch das Raster gefallen, weil sie star auf zwei Ebenen geschrieben wurden.

    Welche Möglichkeiten habe ich, dies rekursiv für eine unbestimmte Anzahl an Ebenen umzusetzen?

    Danke
    Arne


    EDIT:
    Habe noch ein wenig rumprobiert. Das Problem scheint darin zu liegen, dass ich die Childs nicht erfassen kann.
    Ich habe mir mal zu Testzwecken parallel eine flache Liste mit den TreeViewItems befüllt und diese durchlaufen. Bei der ID 317 im Tag bricht er tatsächlich ab und lädt auch die korrekten Daten*.
    Der TreeView expandiert trotz IsExpanded = true am Item nicht. Es gibt ja auch keine Verbindung zur flachen List-Collection, obwohl IsSelected = true greift?!

    Mein Problem scheint zu sein, dass ich beim Durchlaufen der Items im TreeView immer nur an die oberste Ebene komme.
    Selbst mit ItemContainerGenerator.ContainerFromItem() findet jedes Root-Item nur sich selbst.

    Was mache ich falsch?
    Zuletzt editiert von Arne Drews; 16.07.2021, 22:32.
    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    Ich habe es jetzt ohne flache Liste soweit hinbekommen, dass ich alle Items rekursiv durchlaufen kann.
    Code:
    private void EventHandler_ShowFavorites(object sender, RoutedEventArgs e)
    {
        int test = 317;
    
        foreach (TreeViewItem item in tvMenueEntries.Items)
        {
            int id = Convert.ToInt32(item.Tag);
    
            if (id == test)
            {
                item.IsSelected = true;
                return;
            }
    
            if (item.HasItems)
                IterateChilds(item, test);
        }
    }
    
    private void IterateChilds(TreeViewItem item, int search_id)
    {
        foreach (TreeViewItem child in item.Items)
        {
            int id = Convert.ToInt32(child.Tag);
    
            if (id == search_id)
            {
                child.IsSelected = true;
                child.IsExpanded = true;
                tvMenueEntries.Items.Refresh();
    
                return;
            }
    
            if (child.HasItems)
                IterateChilds(child, search_id);
        }
    }
    Er sucht zwar jetzt das korrekte Item aus, was ich daran erkenne, dass der SelectionChanged-EventHandler der Treeview greift und korrekte Daten in weiteren abhängigen Bereichen zur Auswahl geladen werden.
    Allerdings öffnet sich die TreeView immer noch nicht und das aktive Item wird auch nicht als solches dargestellt?!
    PHP rocks!
    Eine Initiative der PHP Community

    Comment

    Working...
    X