Question

J'ai créé un ListBox qui a un DataTemplate en tant que Itemtemplate . Cependant, existe-t-il un moyen simple d'accéder au UIElement généré au lieu du SelectedItem dans codebehind?

Lorsque j'accède à SelectedItem , je récupère simplement l'objet sélectionné de mon Collection ItemsSource . Existe-t-il un moyen d’accéder au UIElement (c.-à-d. Le élément généré à partir de DataTemplate avec l'objet lié)?

Était-ce utile?

La solution

Vous recherchez le ItemContainerGenerator propriété. Chaque ItemsSource a un ItemContainerGenerator instance. Cette classe a la méthode suivante qui pourrait vous intéresser: ContainerFromItem (instance d'objet) .

Une fois que vous avez défini le ListBoxItem , vous pouvez continuer et parcourir l'arborescence logique et visuelle. Consultez assistant d'arborescence logique et Aide à l'arborescence visuelle .

Comme Andy l'a dit dans les commentaires, ce n'est pas parce qu'un élément existe dans votre collection que son conteneur a été généré. Tout type de scénario de panneau de virtualisation soulèvera ce problème. UIElements sera réutilisé pour les différents articles. Soyez prudent avec ça aussi.

Autres conseils

siz , Andy et Bodeaker ont absolument raison.

Voici comment j'ai pu récupérer la zone de texte de l'élément sélectionné dans la liste à l'aide de sa poignée.

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();
}

(Remarque: ici, VisualTreeWalker est mon propre wrapper sur VisualTreeHelper avec diverses fonctions utiles exposées)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top