2009-06-16 13 views

Respuesta

41

Una solución similar a la de Seb, pero probablemente con un mejor rendimiento:

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

+1, gracias aunque simple resolvió mi problema –

+0

parece que el control no tiene renderizado/mostrado aún, no tendrá ningún elemento. – Maslow

0

Supongo que ItemsControl.Items[index] no funciona, ¿no?

No estoy siendo gracioso, y no lo he comprobado, esa es solo mi primera suposición. Con mucha frecuencia, un control tendrá una propiedad indexadora de elementos, incluso si está enlazado a datos.

+2

Esto no tiene' t recupera los elementos "secundarios" (controles), solo los elementos de la lista, que no son necesariamente controles. –

+1

No, si usa una fuente de datos y una plantilla de datos, p. una carga de cadenas para usar en una plantilla de datos, obtiene la cadena devuelta como el elemento. –

+0

Bastante justo. Dejaré mi respuesta ya que sus comentarios podrían ser útiles. –

-2

Utilice la propiedad ItemsControl.Items:

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

Para repetir mi comentario, si usa una fuente de datos y una plantilla de datos, p. una carga de cadenas para utilizar en una plantilla de datos, se obtiene la cadena devuelta como el elemento –

+0

Bueno, entonces debería ir con la solución de Seb – Oskar

19

ver si esto le ayuda a cabo:

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

Hay una diferencia entre los elementos lógicos en un control y una UIElement.

9

Para identificar ItemsControl 'controles secundarios de enlace de datos s (como un ToggleButton), puede utilizar esto:

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

Debe llamar a 'c.ApplyTemplate();' antes de llamar 'FindName()' o bien devuelve null. – Karmacon

+0

@Karmacon funciona bien sin 'c.ApplyTemplate();' para mí ... – rumblefx0

Cuestiones relacionadas