wpf 为什么C#中的延迟加载不能正常工作?

wsewodh2  于 2023-10-22  发布在  C#
关注(0)|答案(1)|浏览(112)

我正在开发一个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();
}
f4t66c6m

f4t66c6m1#

为什么要使用这种延迟加载?如果只是为了性能,你可能想看看WPF虚拟化,它不会一次将所有元素加载到列表视图中。
但是要小心,如果你把你的元素放到一个scrollviewer中,虚拟化是不起作用的,因为在scrollviewer中总是有足够的空间来加载所有元素。

相关问题