2009-06-16 27 views
19

Se ho un elemento derivato dal ItemsControl, posso accedere ad una collezione di è bambini in modo che io possa ciclo attraverso di loro per eseguire determinate azioni? Non riesco a trovare alcun modo semplice al momento.Come accedere ai figli di un ItemsControl?

risposta

41

una soluzione simile a Seb di ma probabilmente con una migliore performance:

for(int i = 0; i < itemsControl.Items.Count; i++) 
{ 
    UIElement uiElement = 
     (UIElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(i); 
} 
+0

+1, grazie anche se semplice risolto il mio problema –

+0

sembra se il controllo non ha reso/mostrato ancora, non avrà alcun oggetto. – Maslow

0

Sto assumendo ItemsControl.Items[index] non funziona, allora?

non sto essere divertente, e non ho controllato per me stesso - che è solo la mia prima congettura. Molto spesso un controllo avrà una proprietà di indicizzatore di elementi, anche se è un database.

+2

Questo doesn' t recuperare gli elementi "figlio" (controlli), solo gli elementi della lista, che non sono necessariamente controlli. –

+1

No if, si utilizza un'origine dati e un modello dati, ad es. un carico di stringhe da utilizzare in un modello di dati, si ottiene la stringa restituita come elemento. –

+0

Abbastanza giusto. Lascerò la mia risposta perché i tuoi commenti potrebbero essere utili. –

-2

utilizzare la proprietà ItemsControl.Items:

foreach (var item in itemsControl1.Items) 
{ 
    Console.WriteLine(item.ToString()); 
} 
+0

Per ripetere il mio commento, se si utilizza un'origine dati e un modello di dati, ad es. un carico di stringhe da utilizzare in un modello di dati, si ottiene la stringa restituita come l'elemento –

+0

Bene, allora si dovrebbe andare con la soluzione di Seb – Oskar

19

vedere se questo ti aiuta:

foreach(var item in itemsControl.Items) 
{ 
    UIElement uiElement = 
     (UIElement)itemsControl.ItemContainerGenerator.ContainerFromItem(item); 
} 

C'è una differenza tra gli elementi logici in un controllo e di una UIElement.

9

Per identificare ItemsControl 'controlli figlio databound s (come un ToggleButton), è possibile utilizzare questo:

for (int i = 0; i < yourItemsControl.Items.Count; i++) 
{ 

    ContentPresenter c = (ContentPresenter)yourItemsControl.ItemContainerGenerator.ContainerFromItem(yourItemsControl.Items[i]); 
    ToggleButton tb = c.ContentTemplate.FindName("btnYourButtonName", c) as ToggleButton; 

    if (tb.IsChecked.Value) 
    { 
     //do stuff 

    } 
} 
+0

È necessario chiamare 'c.ApplyTemplate();' prima di chiamare 'FindName()' altrimenti restituisce null. – Karmacon

+0

@Karmacon Funziona bene senza 'c.ApplyTemplate();' per me ... – rumblefx0

Problemi correlati