如何访问ItemsControl的子项?

Jam*_*Hay 25 c# wpf itemscontrol

如果我有一个派生的组件ItemsControl,我可以访问它的子集合,以便我可以循环它们来执行某些操作吗?我现在似乎找不到任何简单的方法.

Tho*_*que 54

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

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

  • 似乎如果控件还没有呈现/显示,它不会有任何项目。 (2认同)

Seb*_*son 22

看看这是否有助于你:

foreach(var item in itemsControl.Items)
{
    UIElement uiElement =
        (UIElement)itemsControl.ItemContainerGenerator.ContainerFromItem(item);
}
Run Code Online (Sandbox Code Playgroud)

控件中的逻辑项与之间存在差异UIElement.


Jun*_*r M 12

要识别数据ItemsControl绑定子控件(如a 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

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要在调用 `FindName()` 之前调用 `c.ApplyTemplate();`,否则返回 null。 (3认同)
  • 我认为这应该是公认的答案。无论如何,必须检查 c 变量,因为它可能为空,例如,如果控件不可见。 (2认同)