Domanda

Voglio essere in grado di attraversare l'albero ui visiva alla ricerca di un elemento con un ID legato alla proprietà Tag dell'elemento visivo.

Mi chiedo come faccio questo. I controlli non hanno figli da attraversare.

ho iniziato ad usare LogicalTreeHelper.GetChildren, che sembra funzionare come previsto, fino a quando mi ha colpito un controllo TreeView ... poi LogicalTreeHelper.GetChildren doesnt tornare figli.

Nota: lo scopo è quello di trovare l'elemento dell'interfaccia utente visivo che corrisponde alla voce di dati. Cioè, dato un ID della voce, andare a trovare l'elemento dell'interfaccia utente visualizzarlo.

Edit: sto a quanto pare non sto spiegando questo abbastanza bene. Sto legando alcuni oggetti di dati a un controllo TreeView e quindi voler selezionare un elemento specifico programaticly dato ID di quell'oggetto di business. Io non vedo il motivo per cui è così difficile travers l'albero visuale e trovare l'elemento che voglio, come l'ID dell'oggetto dati è nella proprietà Tag dell'elemento visivo appropriata. Sto usando Mole e sono in grado di trovare l'elemento dell'interfaccia utente con l'ID appropriato in esso di Tag. Non riesco proprio a trovare l'elemento visivo nel codice. LogicalTreeHelper non attraversa tutti gli elementi nella struttura. Né ItemContainerGenerator.ContainerFromItem recuperare qualche cosa per gli elementi della visualizzazione ad albero.

Nessuna soluzione corretta

Altri suggerimenti

Date un'occhiata a questo esempio . Ho trovato questo campione scritto molto bene e credo che l'utilizzo di vista-modello sarà risolvere il problema.

Modifica e per quanto riguarda la ricerca del albero visuale. Sia TreeView e TreeViewItem avere elementi proprietà che si può attraversare e cercare il tuo Id. Non puoi usarlo?

Il problema è che solo il TreeViewItems che sono visibili sono stati creati - WPF non crea tutte le voci in anticipo (a causa della lunghezza del tempo che potrebbe prendere per alberi di grandi dimensioni, immagino)

.

Un approccio migliore sarebbe quello di creare una struttura dati che imita la struttura dei dati di alberi, e utilizzare l'associazione dati per dire al TreeView come visualizzare i dati. Posso scrivere un semplice esempio, se vuoi.

EDIT: Sulla base della sua modifica, che funzionerà solo se l'elemento di interfaccia utente è stata creata per l'oggetto, che non è garantito. Date un'occhiata alla IItemContainerGenerator interfaccia ( recuperate chiamando ItemsControl.ItemContainerGenerator . credo che ha un metodo che restituirà il contenitore UI (cioè TreeViewItem) per un oggetto di dati. ciò funziona solo se il contenitore UI è stato creato in precedenza.

LogicalTreeHelper.GetChildren guarda proprietà LogicalChildren del controllo, che è nullo per difetto di un TreeView (derivata dalla classe ItemsControl). Potrebbe essere necessario ispezionare il tipo degli oggetti restituiti da GetChildren e quando si arriva a un oggetto TreeView, quindi fare un po 'la logica di elaborazione speciale.

Questa logica speciale sarà probabilmente l'iterazione di Articoli del albero e cercando di gettarli a un FrameworkElement (la classe base che definisce proprietà Tag).

Ho fatto cose simili recursing attraverso la struttura ad albero visuale utilizzando VisualTreeHelper. Scopri questo post del blog scritto da Jim Baltzell-Gauthier - fornisce alcuni metodi di supporto per camminare albero visuale e restituisce un elemento in base al nome e tipo, questo è simile al codice che sto usando il mio progetto in corso. Si potrebbe modificare queste funzioni di averlo controllare i valori delle variabili in sostituzione o in aggiunta al nome.

Una cosa da essere a conoscenza di con il Visual albero è che non è lì a meno che le immagini sono state caricate - potrebbe essere necessario collegare un delegato per l'evento "Loaded" della vostra elemento visivo se il visivo non è stato ancora reso al punto che si chiama il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top