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

问题描述 投票:0回答:1

我正在开发一个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();
}
c# wpf listview lazy-loading
1个回答
0
投票

为什么要使用延迟加载?如果只是为了性能,您可能需要考虑 WPF 虚拟化,它不会立即将所有元素加载到列表视图中。

但是要小心,如果您将元素放入滚动查看器中,虚拟化将不起作用,因为滚动查看器内部始终有足够的空间来加载所有元素。

© www.soinside.com 2019 - 2024. All rights reserved.