14 Stimmen

WPF ListBox - Abrufen von UIElement anstelle von SelectedItem

Ich habe eine ListBox die eine DataTemplate als Itemtemplate . Gibt es jedoch eine einfache Möglichkeit, auf die generierten UIElement anstelle der SelectedItem in codebehind?

Wenn ich auf SelectedItem erhalte ich einfach das ausgewählte Objekt aus meinem ItemsSource Sammlung. Gibt es eine Möglichkeit, auf die UIElement (d.h. das Element, das aus dem DataTemplate zusammen mit dem gebundenen Objekt)?

14voto

Szymon Rozga Punkte 17510

Sie suchen nach dem ItemContainerGenerator Eigentum. Jede ItemsSource hat eine ItemContainerGenerator Instanz. Diese Klasse hat die folgende Methode, die Sie interessieren könnte: ContainerFromItem(object instance) .

Sobald Sie einen Zugriff auf die ListBoxItem können Sie den logischen und visuellen Baum durchsuchen. Ausprobieren Logical Tree Helper y Visual Tree Helper .

Wie Andy in den Kommentaren sagte, bedeutet die Tatsache, dass der Gegenstand in Ihrer Sammlung vorhanden ist, nicht, dass ein Container für ihn erstellt wurde. Jede Art von Virtualisierungspanel-Szenario wird dieses Problem aufwerfen; UIElemente werden in den verschiedenen Elementen wiederverwendet. Seien Sie auch damit vorsichtig.

5voto

vamosrafa Punkte 252

siz , Andy y Bodeaker sind absolut richtig.

So konnte ich das Textfeld des ausgewählten Elements des Listenfelds mit seinem Handle abrufen.

var container = listboxSaveList.ItemContainerGenerator.ContainerFromItem(listboxSaveList.SelectedItem) as FrameworkElement;
if (container != null)
{
    ContentPresenter queueListBoxItemCP = VisualTreeWalker.FindVisualChild<ContentPresenter>(container);
    if (queueListBoxItemCP == null)
        return;

    DataTemplate dataTemplate = queueListBoxItemCP.ContentTemplate;

    TextBox tbxTitle = (TextBox)dataTemplate.FindName("tbxTitle", queueListBoxItemCP);
    tbxTitle.Focus();
}

(Hinweis: Hier ist VisualTreeWalker mein eigener Wrapper über VisualTreeHelper mit verschiedenen nützlichen Funktionen ausgesetzt)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X