为什么列表框和树视图会如此缓慢地加载大量数据?

时间:2014-12-29 13:35:52

标签: c# wpf mvvm listbox

问题是相对于DataGrid。

我在MySQL数据库中有一个表。它有大约20列,存储大约32,000条记录。

所以我通常使用DataGrid在我的测试应用程序中加载它们,它通常需要两秒或更短的时间来填充所有信息而不会延迟加载。 (EF 6)

所以我真的只需要一个列并决定使用ListView。事情是我只在非常小的桌子上使用它,所以滞后甚至不值得一提。与TreeView一样。

令我感到困惑的是DataGrid几乎可以无缝地处理所有这些信息,而ListBox似乎觉得需要使用箭头键在每次更改选项时重新加载内容。它真的只加载一列。

一旦UserControl初始化,加载需要很长时间,我想我可能没有正确优化我的代码。也许两者的对待方式不同?

这是XAML:

<ListBox ItemsSource="{Binding Principal, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="first" SelectedItem="{Binding SelectedUser, Mode=TwoWay, UpdateSourceTrigger=PropertyCHanged}" IsSynchronizedWithCurrentItem="True" Width="Auto"/>

在视图模型中,这是它的DataBound属性:

    // Private ObservableCollection Declaration
    private ObservableCollection<principal> _principal;

    // Public ObservableCollection Declaration
    public ObservableCollection<principal> Principal
    {
        get
        {
            return _principal;
        }
        set
        {
            if (_principal != value)
            {
                value = _principal;
            }
            OnPropertyChanged("Principal");
        }
    }

几乎就是这样。我的DataGrid绑定到完全相同的属性与非常相似的XAML代码,但它将在十分之一的时间内加载所有列,它将采用Listbox或TreeView。

我已经有一段时间了,但它还没有结账。 谁知道为什么?

1 个答案:

答案 0 :(得分:1)

我发现ListBox和ListView非常快。

尝试

VirtualizingStackPanel.VirtualizationMode="Recycling"

你是否有可能不限制大小?
如果你不限制大小,那么它将绘制所有元素。