获取未在UI中显示的可视子项

时间:2016-02-03 09:37:56

标签: c# wpf .net-4.5

我使用以下DataTemplate创建了一个CheckedListBox控件:

<WrapPanel>
    <CheckBox x:Name="CheckBox" VerticalAlignment="Center"
    <ContentPresenter Content="{Binding}" Margin="5,2" />
</WrapPanel>

我是codebehind我需要访问属于ListBoxItem的CheckBox:

foreach (var value in Items)
{
    var item = ItemContainerGenerator.ContainerFromItem(value) as ListBoxItem;
    var checkBox = item?.GetVisualChildren<CheckBox>().FirstOrDefault();
}

public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in GetVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

问题在于,当我的列表框包含很多项目时,如果没有滚动条,它们都无法显示,那么GetVisualChildren将为可见部分之外的项目返回null。如果尚未渲染控件,则同样适用于所有项目。无论项目的呈现状态如何,如何更改此代码以始终访问ListBoxItem的CheckBox?我尝试了可视化树,逻辑树FindName,但没有找到解决方案。

1 个答案:

答案 0 :(得分:1)

您可以尝试将仅保留可见项目的VirtualizingStackPanel更改为简单StackPanel作为ItemsPanel。如果性能不是很关键并且不会有很多项目,这应该会有所帮助:

MyComponent