获取列表框中的项目

Posted

技术标签:

【中文标题】获取列表框中的项目【英文标题】:Get items in view within a listbox 【发布时间】:2011-08-21 15:40:11 【问题描述】:

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

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

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

【问题讨论】:

你在这里有答案:***.com/questions/11187382/get-listview-visible-items 【参考方案1】:

有时我也面临同样的问题。我通过使用列表框的“SelectedItem”找到了我的问题的解决方法,因为所选项目将始终可见。就我而言,这是导致问题的滚动。有帮助可以看看-Virtualization issue in listbox

还有 - Virtualization scrollview - Good One

【讨论】:

我不明白为什么项目选择自动意味着项目可见,它很可能被选中但不在视图中。 :)。开发人员现在已经习惯了。【参考方案2】:

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

我从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;

【讨论】:

以上是关于获取列表框中的项目的主要内容,如果未能解决你的问题,请参考以下文章

从 WPF 中的列表框中获取复选框项目

获取列表框中的选定项目并调用另一个存储选定项目的函数

对列表框中的项目列表进行排序

Csharp:根据组合框中的值加载选中的项目列表

选择列表框项目时,在另一个列表框中显示相关数据

Windows 窗体列表框在同一个框中的多个列表