WPF ListBox - Obtener UIElement en lugar de SelectedItem
-
03-07-2019 - |
Pregunta
Creé un ListBox
que tiene un DataTemplate
como Itemtemplate
. Sin embargo, ¿hay una manera fácil de acceder al UIElement
generado en lugar del SelectedItem
en codebehind?
Cuando accedo a SelectedItem
, solo obtengo el objeto seleccionado de mi
Colección ItemsSource
. ¿Hay alguna manera de acceder al UIElement
(es decir, el
elemento generado desde el DataTemplate
junto con el objeto enlazado)?
Solución
Está buscando el ItemContainerGenerator propiedad. Cada ItemsSource
tiene un ItemContainerGenerator instancia. Esta clase tiene el siguiente método que podría interesarle: ContainerFromItem (instancia de objeto) .
Una vez que tenga un identificador del ListBoxItem
, puede seguir adelante y explorar el árbol lógico y visual. Echa un vistazo a Helical Tree Helper y Visual Tree Helper .
Como dijo Andy en los comentarios, solo porque el elemento exista en tu colección no significa que se haya generado un contenedor para él. Cualquier tipo de escenario de panel de virtualización planteará este problema; Los elementos UIElements se reutilizarán en los diferentes artículos. Ten cuidado con eso también.
Otros consejos
siz , Andy y Bodeaker tienen toda la razón.
Aquí es cómo pude recuperar el cuadro de texto del elemento seleccionado del cuadro de lista usando su controlador.
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();
}
(Nota: aquí, VisualTreeWalker es mi propio contenedor sobre VisualTreeHelper con varias funciones útiles expuestas)