在列表框中获取视图中的项目

时间:2011-05-09 12:05:39

标签: c# wpf

我有一个ListBox,其属性VirtualizingStackPanel.VirtualizationMode设置为“Recycling”。 我正在绑定自定义集合(实现IListIList<T>)。

现在,如果我理解正确,当绑定数据时,会调用GetEnumerator 然后为当前视图中的每个项调用属性public T this[int index] { }

我的问题是如何获取当前可见的项目(加载数据后)?

2 个答案:

答案 0 :(得分:3)

有时候我也遇到了同样的问题。我通过使用Listbox的“SelectedItem”找到了我的问题的解决方法,因为所选项目始终可见。在我的情况下,滚动导致问题。你可以看看它是否有帮助 -
Virtualization issue in listbox

另外 - Virtualization scrollview - Good One

答案 1 :(得分:1)

在尝试找出类似的东西之后,我想我会在这里分享我的结果(因为它似乎比其他回复更容易):

我从here得到的简单可见性测试。

private static bool IsUserVisible(FrameworkElement element, FrameworkElement container)
{
    if (!element.IsVisible)
        return false;

    Rect bounds =
        element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight));
    var rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
    return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight);
}

之后,您可以遍历ListBoxItems并使用该测试来确定哪些是可见的。

private List<object> GetVisibleItemsFromListbox(ListBox listBox, FrameworkElement parentToTestVisibility)
{
    var items = new List<object>();

    foreach (var item in PhotosListBox.Items)
    {
        if (IsUserVisible((ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item), parentToTestVisibility))
        {
            items.Add(item);
        }
        else if (items.Any())
        {
            break;
        }
    }

    return items;
}