Pregunta

Quiero ser capaz de recorrer el árbol ui visual en busca de un elemento con un ID con destino a la propiedad Tag del elemento visual.

Me pregunto cómo puedo hacer esto. Los controles no tienen hijos a atravesar.

Empecé a usar LogicalTreeHelper.GetChildren, que parece que funciona como es debido, hasta que me golpeó un control TreeView ... entonces LogicalTreeHelper.GetChildren duerma devuelve ningún niños.

Nota: el objetivo es encontrar el elemento de la interfaz visual que corresponde al elemento de datos. Es decir, dado un identificador del elemento, ir a buscar el elemento de la interfaz de usuario de mostrarlo.

Edit: Me parece que no estoy explicando esto lo suficientemente bien. Estoy Encuadernación algunos objetos de datos a un control TreeView y luego querer seleccionar un elemento específico dado programaticly Identificación de ese objeto de negocio. No veo por qué es tan difícil de Travers el árbol visual y encontrar el elemento que quiero, como el ID del objeto de datos se encuentra en la propiedad Tag del elemento visual apropiado. Estoy usando Mole y yo soy capaz de encontrar el elemento de interfaz de usuario con el identificador apropiado en ella de etiqueta. No puedo encontrar el elemento visual en el código. LogicalTreeHelper no atraviesa ningún artículo en el árbol. Ni qué ItemContainerGenerator.ContainerFromItem recuperar nada para los elementos de la vista de árbol.

No hay solución correcta

Otros consejos

miren una muestra . He encontrado esta muestra muy bien escrito y creo que el uso de la vista-modelo va a resolver su problema.

Editar Y con respecto a la búsqueda del árbol visual. Ambos tienen TreeView y TreeViewItem Artículos propiedad que se puede recorrer y buscar su identificación. ¿No puedes usarlo?

El problema es que sólo el TreeViewItems que son visibles han sido creados - WPF no crea todos los elementos en la delantera (debido a la longitud de tiempo que podría dar por grandes árboles, me imagino)

.

Un mejor enfoque sería la creación de una estructura de datos que imita la estructura de los datos de los árboles, y el uso de los datos de unión para contar la TreeView cómo mostrar los datos. Puedo escribir un ejemplo sencillo, si lo desea.

EDIT: Gracias a tu comentario, que sólo funcionará si el elemento de interfaz de usuario ha sido creado para ese objeto, que no está garantizado. Echar un vistazo a la IItemContainerGenerator interfaz ( recuperado llamando ItemsControl.ItemContainerGenerator . creo que tiene un método que devolverá el contenedor de la interfaz de usuario (es decir TreeViewItem) para un objeto de datos especificado. Esto sólo funcionará si el contenedor de la interfaz de usuario ha sido creado previamente.

LogicalTreeHelper.GetChildren mira propiedad LogicalChildren del control, que es nula por defecto para un TreeView (derivado de clase ItemsControl). Puede que tenga que inspeccionar el tipo de los objetos devueltos por GetChildren y cuando se llega a un objeto TreeView, a continuación, hacer un poco de lógica de procesamiento especial.

Esa lógica especial será probablemente interactuando sobre artículos de los árboles y tratando de echarlos a un FrameworkElement (la clase base que define la propiedad Tag).

He hecho cosas similares por recursiva a través del árbol visual usando VisualTreeHelper. Echa un vistazo a esta entrada del blog escrito por Jim Baltzell-Gauthier - proporciona algunos métodos de ayuda para recorrer el árbol visual y devolver un elemento por su nombre y tipo, esto es similar al código que estoy usando en mi proyecto actual. Se podría modificar estas funciones para que se compruebe valores de variables en lugar de o además del nombre.

Una cosa a tener en cuenta con el árbol visual es que no existe a menos que los efectos visuales se han cargado - puede que tenga que colocar un delegado para el evento "cargado" de su elemento visual si el visual no ha sido dictada sin embargo, al punto que se llama al código.

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