Custom ListView Style, большой источник данных - вопросы производительности
Я захотел сделать свой стиль для ListView - это не так сложно:
<Style TargetType="{x:Type local:MyListView}">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility"
Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility"
Value="Auto"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyListView}">
<ScrollViewer>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Но возникла проблема - в момент привязки сравнительно большого источника данных (5000 элементов) происходила значительная задержка (4 секунды); при использовании стандартного стиля все работало очень быстро.
После нескольких часов творческого поиска я обнаружил, что проблема решается при помощи свойства ScrollViewer.CanContentScroll следующим образом:
<Setter Property="ScrollViewer.CanContentScroll"
Value="true"/>
Проблема состояла в том, что при использовании моего стиля ScrollViewer работал в режиме физического (то есть "попиксельного") скроллинга (CanContentScroll == false). Естественно, в этом режиме контейнеру нужно знать суммарную высоту содержимого - на эти измерения (строк) тратилось время при привязке, что и выяснилось при помощи профайлера.
Устанавливая CanContentScroll в true, мы включаем логический ("поэлементный") режим скроллинга. В таком режиме скроллинг происходит в "виртуальной" манере, и измеряется высота только видимых элементов - задержки нет. Заинтересовавшиеся этим вопросом могут исследвать интерфейс IScrollInfo.