如何延迟计算 wpf:DataGrid,仅在需要时检索数据

本文关键字:数据 检索 DataGrid 何延迟 延迟 wpf 计算 | 更新日期: 2023-09-27 18:33:03

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

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

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

我知道在初始化时,数据网格会遍历每一行以测量最大列宽和其他属性。它显然会为所有行执行此操作,无论它们是否在屏幕上。

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

两者都会产生相同的结果。仅包含 20000 个项目的 ToList(( 不会导致大量内存消耗,这仅在绑定到数据网格时才会发生。

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

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

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

如果没有,建议的解决方法是什么?

如何延迟计算 wpf:DataGrid,仅在需要时检索数据

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

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

但是,如果数据网格包含在滚动查看器中,这将不起作用。在滚动查看器中,数据网格的每个部分几乎都是可见的,因此将呈现整个数据网格。然后,滚动查看器仅显示此呈现的数据网格中适合 UI 窗口的部分。

由于滚动查看器

中的数据网格看起来就像管理自己的滚动条的数据网格,因此我没有注意到滚动查看器。

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

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

在这种情况下

,您要绑定的属性假设您的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 方法。而不是将实际值存储在类中。 希望这有帮助