我有以下情况:
<ScrollViewer>
<Grid>
<!--many other controls-->
<DataGrid />
</Grid>
</ScrollViewer>
现在,当我将DataGrid绑定到大量数据(大约10,000行)时,我的性能非常慢。事实上,我得到OutOfmemory异常(我有8 GB的内存)!我在某处读到这是因为ScrollViewer重写了DataGrid虚拟化(或类似的东西),但我不知道如何防止这种情况。如果我删除ScrollViewer,问题就解决了!数据加载时间不到一秒钟。
我想保留ScrollViewer(因为其他控件)并且具有良好的性能。那可能吗?如果没有,还有其他解决方案吗?
答案 0 :(得分:7)
这些问题的一个常见解决方法是在与DataGrid
相同的行中添加一个不可见的“大小调整元素”,然后您可以将DataGrid.Height
绑定到ActualHeight
的{{1}}尺码元素。这样,您的DataGrid
将始终消耗RowDefinition
的高度。实施例
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Content="Some Control.." />
<Rectangle Name="sizingElement"
Grid.Row="1"
Fill="Transparent"
Margin="1"/>
<DataGrid Grid.Row="1"
Height="{Binding ElementName=sizingElement,
Path=ActualHeight, FallbackValue=1}">
<!--...-->
</DataGrid>
<Button Content="Some more controls etc.." Grid.Row="2"/>
</Grid>
</ScrollViewer>
答案 1 :(得分:2)
外部ScrollViewer有效地为DataGrid提供了所需的空间,这样它的高度变得很大,一次显示所有行。只需通过在其上显式设置高度来限制DataGrid,例如。