I've started exploring the Data and UI virtualization features in WPF recently and stumbled upon something strange.
I created a DataGrid
's with Virtualizing
enabled and filled it with a list with 1,000,000 items. This works great and amazingly fast.
<Grid>
<DataGrid x:Name="employees" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.VirtualizationMode="Recycling"/>
</Grid>
However, when I nested it under a StackPanel
it loads for over a minute until I get OutOfMemoryException
. I've set the same VirtualizingPanel
properties on the StackPanel
as well but it doesn't help.
Is this behaviour intentional or am I missing something basic here? And how can I manage to support data virtualization in nested controls?
a
StackPanel
is an "infinite container" (notice the quotes), in the sense that it does NOT impose a limit in the size of its children, like aGrid
orDockPanel
does.What this means in terms of UI virtualization is that, since your
DataGrid
is not limited inHeight
, it will grow endlessly and render all it's items, effectively losing UI virtualization.See MSDN: WPF Layout for more details.
The bottom line is that you need make sure you use the appropiate layout containers, depending on your needs.