我有一个ListBox,其属性VirtualizingStackPanel.VirtualizationMode设置为“Recycling”。
我正在绑定自定义集合(实现IList
和IList<T>
)。
现在,如果我理解正确,当绑定数据时,会调用GetEnumerator
然后为当前视图中的每个项调用属性public T this[int index] { }
。
我的问题是如何获取当前可见的项目(加载数据后)?
答案 0 :(得分:3)
有时候我也遇到了同样的问题。我通过使用Listbox的“SelectedItem”找到了我的问题的解决方法,因为所选项目始终可见。在我的情况下,滚动导致问题。你可以看看它是否有帮助 -
Virtualization issue in listbox
答案 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;
}