获取列表框中的项目
Posted
技术标签:
【中文标题】获取列表框中的项目【英文标题】:Get items in view within a listbox 【发布时间】:2011-08-21 15:40:11 【问题描述】:我有一个 ListBox,其属性 VirtualizingStackPanel.VirtualizationMode 设置为“回收”。
我正在将一个自定义集合(实现 IList
和 IList<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;
【讨论】:
以上是关于获取列表框中的项目的主要内容,如果未能解决你的问题,请参考以下文章