【问题标题】:How do I access the children of an ItemsControl?如何访问 ItemsControl 的子项?
【发布时间】:2010-11-03 06:36:07
【问题描述】:

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

【问题讨论】:

    标签: c# wpf itemscontrol


    【解决方案1】:

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

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

    【讨论】:

    • 如果控件还没有渲染/显示,它似乎没有任何项目。
    【解决方案2】:

    看看这对你有没有帮助:

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

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

    【讨论】:

      【解决方案3】:

      要识别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
      
          }
      }
      

      【讨论】:

      • 在调用FindName()之前需要先调用c.ApplyTemplate();,否则返回null。
      • 我认为这应该是公认的答案。无论如何,必须检查 c 变量,因为它可以为空,例如如果控件不可见。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多