WPF ListBox - Obtenir UIElement au lieu de SelectedItem
-
03-07-2019 - |
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é)?
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)