繁体   English   中英

如何懒惰评估wpf:DataGrid,仅在需要时检索数据

[英]How to lazy-evaluate a wpf:DataGrid, retrieving data only as needed

我有一个WPF数据网格,绑定到一个由数据库中的linq-to-sql填充的列表。 绑定是双向的,允许用户更改每行中的值

        <wpf:DataGrid AutoGenerateColumns="False" 
              ItemsSource="{Binding MyList}" 
              SelectedItem="{Binding SelectedItem}" >

当显示大约20000行时,程序在列表初始化期间因内存不足异常而崩溃。 即使行数较少,性能也会变得难以忍受。

我知道在初始化时,datagrid遍历每一行来测量最大列宽和其他属性。 它显然会对所有行都这样做,无论它们是否在屏幕上。

我尝试将datagrid绑定到myQuery.ToList() (以允许通过单击列对数据网格进行排序)或直接绑定到IQueryable。 (排序不适用于此)

两者都产生相同的结果。 仅具有20000个项目的ToList()不会导致大量内存消耗,只有当它绑定到数据网格时才会发生这种情况。

忽略数据网格中20000行有用的问题(这些是当前的要求;更改那些工作示例会有所帮助)。

什么是懒惰加载当前显示在屏幕上的数据的最简单方法,并忽略其他所有内容,直到它滚动到视图中?

这可以在没有第三方库和主要代码更改的情况下完成吗?

如果没有,推荐的解决方法是什么?

事实证明,问题完全是我的用户错误:

WPF Datagrid可以很好地进行UI虚拟化:仅在需要时绘制消耗行对象的内存; 如果行在数据网格的可见边界之外,则不会实例化它。

但是,如果数据网格包含在ScrollViewer中,则无效。 在scrollviewer中,datagrid的每个部分几乎都是可见的,因此将呈现整个数据网格。 然后,scrollviewer仅显示适合UI窗口内部的渲染数据网格的一部分。

由于scrollviewer中的数据网格看起来就像管理自己的滚动条的数据网格,我没有注意到scrollviewer。

删除滚动查看器后,即使高度和宽度可变,大量行也不会引起任何问题。 datagrid只是填充可用空间,并且只根据需要实例化新行。

简而言之,我的问题的解决方案是:不要将数据网格放在scrollviewer中

你在他的案例中绑定的属性让我们说你的MyList由MyFile对象( List<MyFile> )组成,然后你必须创建你的MyFile类:

 class MyFile
    {
        public string FullPath { get; set; }

        public string Extension
        {
            get
            {
                return Path.GetExtension(FullPath);
            }
        }

        public string PathRoot
        {
            get
            {
                return Path.GetPathRoot(FullPath);
            }
        }

        public DateTime CreationTime
        {
            get
            {
                return File.GetCreationTime(FullPath);
            }
        }

    }

这样你就可以在每个对象中存储更少的信息,然后在网格中显示的几个项目上调用get方法。 与在课堂上存储的实际值相对应。 希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM