【问题标题】:ListBox ... get all child items that are visible in the UI? wpfListBox ... 获取 UI 中可见的所有子项? wpf
【发布时间】:2012-05-18 07:17:51
【问题描述】:

我有一个ListBox

我需要获取 UI 中可见的所有项目的列表。

如何做到这一点?

【问题讨论】:

标签: c# wpf listbox


【解决方案1】:
listbox.Items.Cast<UIElement>().Where(x => x.IsVisible)

【讨论】:

  • 如果 Items 包含数据项而不是 UIElements(通常是这种情况)则不起作用。
  • 确实如此,但您不应该将任何数据包装在 ListBoxItem 中吗?
  • 不,没必要……如果它是数据绑定到类对象的集合,我们不能将它转换为 UIElement……
  • @Rob:如果您已将 ItemsControl 绑定到数据源,它将自动将数据项包装在容器中(在本例中为 ListBoxItem)。但是,它不会通过 Items 集合公开这些容器 - 该集合仍将包含您所期望的原始数据项。要获取容器,您需要使用 ItemContainerGenerator。
【解决方案2】:

要获取所有控件,请使用此代码

foreach (var item in list.Items)
{
     var myContentPresenter = FindVisualChild<ContentPresenter>(list.ItemContainerGenerator.ContainerFromItem(item));
     DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
     TextBox tb = (TextBox)myDataTemplate.FindName("tb", myContentPresenter);
}

FindVisualChild 方法:

 private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is childItem)
                {
                    return (childItem)child;
                }
                else
                {
                    childItem childOfChild = FindVisualChild<childItem>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }

XAML 如下所示:

...
<ListBox Name="list">
    <ListBox.ItemTemplate>
         <DataTemplate>
              <TextBox x:Name="tb"/>
         </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多