如何访问ItemsControl的子项?

39

如果我有一个派生自ItemsControl的组件,我可以访问它的子项集合,以便我可以循环遍历执行某些操作吗?目前似乎找不到任何简单的方法。

3个回答

68

一个类似于Seb的解决方案,但可能具有更好的性能:

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

3
如果控件尚未渲染或显示,它似乎将不具有任何项目。 - Maslow

26

看看这是否能帮助您:

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

在控件中,逻辑项和 UIElement 有所不同。


23

要识别ItemsControl的数据绑定子控件(例如ToggleButton),可以使用以下代码:

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

    }
}

4
在调用FindName()之前你需要调用c.ApplyTemplate();,否则它会返回null。 - Karmacon
2
在我看来,这应该是被接受的答案。无论如何,必须检查变量c是否为空,例如如果控件不可见。 - Emanuele Benedetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接