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)?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top