我正在开发一个wpf应用程序(.net框架),我想为列表视图实现延迟加载。因此,当单击按钮时,我会从数据库中逐段获取数据并将其添加到列表视图中,直到出现列表视图垂直滚动条。问题是,第一次单击按钮时,数据库中的所有数据都会添加到列表视图中。但从第二次开始,我的代码运行正确,即数据库中的数据仅添加到列表视图中,直到出现滚动条。有人可以解释为什么会发生这种情况以及解决方案是什么吗?
这是我写的代码:
注意:我将 listView ItemsSource 属性绑定到名为 PeopleList 的 BindingList。
private void DisplayAllPeople()
{
_peopleTablePageNumber = 0;
PeopleList = new BindingList<Person>();
bool isScrollBarVisible = false;
bool isEndOfTable = false;
while (!isScrollBarVisible && !isEndOfTable)
{
IEnumerable<Person> peoplePage = _dataCollector.GetPersons()
.Skip(_peopleTablePageNumber * _peoplePerPageCount)
.Take(_peoplePerPageCount);
PeopleList.AddRange(peoplePage);
_peopleTablePageNumber++;
ScrollViewer sv = FindVisualChild<ScrollViewer>(listViewPeople);
Visibility VerticalScrollbarVisibility = sv.ComputedVerticalScrollBarVisibility;
isScrollBarVisible = (VerticalScrollbarVisibility == Visibility.Visible);
isEndOfTable = (peoplePage.Count() < _peoplePerPageCount);
}
}
private childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
更新: 这是我的 DataCollector 类的 GetPersons 方法:
public List<Person> GetPersons()
{
return _dBContext.Persons.ToList();
}
为什么要使用延迟加载?如果只是为了性能,您可能需要考虑 WPF 虚拟化,它不会立即将所有元素加载到列表视图中。
但是要小心,如果您将元素放入滚动查看器中,虚拟化将不起作用,因为滚动查看器内部始终有足够的空间来加载所有元素。