如何延迟评估 wpf:DataGrid,仅根据需要检索数据

Hug*_*une 4 c# wpf datagrid lazy-evaluation wpfdatagrid

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

        <wpf:DataGrid AutoGenerateColumns="False" 
              ItemsSource="{Binding MyList}" 
              SelectedItem="{Binding SelectedItem}" >
Run Code Online (Sandbox Code Playgroud)

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

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

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

两者产生相同的结果。仅包含 20000 个项目的 ToList() 不会导致大量内存消耗,只有在绑定到 datagrid 时才会发生这种情况。

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

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

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

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

Hug*_*une 5

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

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

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

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

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

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