How do I access the children of an ItemsControl?
Asked Answered
H

3

39

If i have a component derived from ItemsControl, can I access a collection of it's children so that I can loop through them to perform certain actions? I can't seem to find any easy way at the moment.

Hello answered 16/6, 2009 at 9:6 Comment(0)
L
69

A solution similar to Seb's but probably with better performance :

for(int i = 0; i < itemsControl.Items.Count; i++)
{
    UIElement uiElement =
        (UIElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(i);
}
Lasandralasater answered 16/6, 2009 at 9:42 Comment(1)
it seems if the control hasn't rendered/been shown yet, it won't have any items.Cheer
Z
26

See if this helps you out:

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

There is a difference between logical items in a control and an UIElement.

Zaragoza answered 16/6, 2009 at 9:31 Comment(0)
C
23

To identify ItemsControl's databound child controls (like a ToggleButton), you can use this:

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

    }
}
Comity answered 9/12, 2009 at 20:11 Comment(2)
You need to call c.ApplyTemplate(); before calling FindName() or else it returns null.Lelea
This should be the accepted answer in my opinion. Anyway the c variable must be checked because it can be null, for example if the control is not visible.Incorporation

© 2022 - 2024 — McMap. All rights reserved.