我正在开发一个wpf应用程序(.net framework),我想实现列表视图的延迟加载。因此,当单击一个按钮时,我将从数据库中逐段获取数据,并将其添加到列表视图中,直到出现列表视图垂直滚动条。问题是,当我第一次单击该按钮时,数据库中的所有数据都被添加到列表视图中。但是从第二次开始,我的代码就正确运行了,也就是说,来自数据库的数据只添加到listview中,直到滚动条出现。有人能解释一下为什么会发生这种情况,解决办法是什么吗?
这是我写的代码:
注意:我将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;
}
UPDATE:这是我的DataCollector类的GetPersons方法:
public List<Person> GetPersons()
{
return _dBContext.Persons.ToList();
}
1条答案
按热度按时间f4t66c6m1#
为什么要使用这种延迟加载?如果只是为了性能,你可能想看看WPF虚拟化,它不会一次将所有元素加载到列表视图中。
但是要小心,如果你把你的元素放到一个scrollviewer中,虚拟化是不起作用的,因为在scrollviewer中总是有足够的空间来加载所有元素。