Решение проблемы состояло в том, чтобы не визуализировать семь столбцов, каждый с одним виртуализированным ItemsControl, в ScrollViewer (который, казалось, расширяет ItemsControls и заставляет их рисовать все элементы управления), а визуализировать с помощью одного ItemsControl, решая прокрутку с помощью ItemsControl.Template.и отображая одну строку за раз.
Я создал новую коллекцию и захватил объекты "на строку"
for(int PI = 0; PI < MathHelper.Max(Monday.Count, Tuesday.Count, Wednesday.Count, Thursday.Count, Friday.Count, Saturday.Count, Sunday.Count); PI++)
{
Presentation.Add(new WeekRow(
Monday.Count > PI ? Monday[PI] : null,
Tuesday.Count > PI ? Tuesday[PI] : null,
Wednesday.Count > PI ? Wednesday[PI] : null,
Thursday.Count > PI ? Thursday[PI] : null,
Friday.Count > PI ? Friday[PI] : null,
Saturday.Count > PI ? Saturday[PI] : null,
Sunday.Count > PI ? Sunday[PI] : null
));
}
И отобразил их, используя эту
<ItemsControl ItemsSource="{Binding Presentation}" VirtualizingPanel.ScrollUnit="Pixel">
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer CanContentScroll="True" Focusable="False">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel
Orientation="Vertical"
IsVirtualizing="True"
VirtualizationMode="Recycling">
</VirtualizingStackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<MyControl Item="{Binding Monday}" Grid.Column="0" ... />
...
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate
</ItemsControl>
Здесь действительно важно установить для свойства CanContentScroll объекта ScrollViewer значение true, иначе виртуализация не будет работать (кто знает, почему).Этого не хватало в ответе @ Marc.
Редактировать: Стоит также упомянуть, что для получения "плавной прокрутки" (ну, "гладкой", какой может получить wpf ..),необходимо установить для VirtualizingPanel.ScrollUnit значение «Pixel».Но он только работает, когда установлен для ItemsControl, , а не для самого ScrollViewer, ItemsPresenter или VirtualizingStackPanel.По какой-то причине.