Разница между WPF DataGrid EnableRowVirtualization и свойствами VirtualizingStackPanel.IsVirtualizing

Информация о влиянии настройки практически отсутствует,

VirtualizingStackPanel.IsVirtualizing="True" 

и

EnableRowVirtualization="True" EnableColumnVirtualization="True". 

Может кто-то уточнить, в чем разница?

Кроме того, в качестве дополнительного бонуса, кто-нибудь может пояснить, действительно ли EnableRowVirtualization и EnableColumnVirtualization ничего не делают на сетке 3.5, поскольку документация MSDN перечисляет эти свойства только в 4.0, но они определенно существуют в 3.5?

Спасибо.

Ответ 1

Оба IsVirtualizing и EnableRowVirtualization/EnableColumnVirtualization работают по тому же принципу, что и элементы визуализируются только тогда, когда это необходимо, и контейнеры повторно используются.

По существу, Panel (или Grid) отслеживает видимость, и если это изменяется, он использует внутренний класс 'ItemContainerGenerator' для создания и создания новых элементов (http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcontainergenerator.aspx).

Мотивация для обоих заключается в том, что контейнеры генерируются только по требованию, тем самым экономя память и повышая производительность.

Что касается двух причин: Panel предназначен для расширения только в одном направлении, горизонтальном или вертикальном; поэтому они внедрили для него одно прикрепленное свойство. A Grid, с другой стороны, распространяется в двух измерениях, поэтому они реализовали свойство для каждого измерения.

Другое отличие: академическое: IsVirtualizing является присоединенным свойством, где его эквиваленты для Grid являются собственными свойствами. Не знаю, почему они выбрали эту разницу...

Соответствующие ссылки http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.enablerowvirtualization(v=vs.100).aspx и http://msdn.microsoft.com/en-us/library/system.windows.controls.virtualizingstackpanel.isvirtualizing.aspx