I have an ItemsControl(List<DaySchedule>
) where each item is a listview(List<Appointment>
).
Since ItemsControl does not provide scrollviewer by default, i have added one as a parent.
Each listview currently has 2000 appointments.
When i inspect the program via snoop, i can see the number of listview items are more than the visible listview items in the window.
I have tinkered around with the virtulization settings without any success.
Can i even get virtulization here?
MainWindow.xaml
<Window
x:Class="WpfApp8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp8"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<ScrollViewer>
<!-- a list of day schedules -->
<ItemsControl
ItemsSource="{Binding}"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock FontSize="20" Text="Schedule For" />
<TextBlock FontSize="20" Text="{Binding DayRoundedDateTime}" />
<!-- a list of appointments -->
<ListView
Margin="10"
ItemsSource="{Binding Appointments}"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<ListView.View>
<GridView>
<!-- name -->
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="Name" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- start time -->
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="StartTime" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding StartTime}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- end time -->
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="EndTime" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding EndTime}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Window>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Windows;
namespace WpfApp8
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
CreateDataContext();
}
void CreateDataContext()
{
var today = DateTime.Now;
today = new DateTime(today.Year, today.Month, today.Day);
// 2 days
var daySchedules = new List<DaySchedule>();
for (int id = 0; id < 2; id++)
{
var day = today.AddDays(id);
var appointments = new List<Appointment>();
//2000 appointments per day
for(int j = 0; j < 2000; j++)
{
appointments.Add(new Appointment { StartTime = day.AddMinutes(j * 5), EndTime = day.AddMinutes(j * 5 + 3), Name = $"Appointment {j+1}" });
}
daySchedules.Add(new DaySchedule { DayRoundedDateTime = day, Appointments = appointments });
}
DataContext = daySchedules;
}
public class DaySchedule
{
public DateTime DayRoundedDateTime { get; set; }
public List<Appointment> Appointments { get; set; }
}
public class Appointment
{
public string Name { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
}
}
UPDATE Even after adapting my code to the suggestions here, virtualization doesn't work. Virtualizing an ItemsControl?
<Window
x:Class="WpfApp8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp8"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<ScrollViewer>
<!-- a list of day schedules -->
<ItemsControl
ItemsSource="{Binding}"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsVirtualizing="True" VirtualizationMode="Recycling" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer
Padding="{TemplateBinding Padding}"
CanContentScroll="True"
Focusable="False">
<ItemsPresenter />
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock FontSize="20" Text="Schedule For" />
<TextBlock FontSize="20" Text="{Binding DayRoundedDateTime}" />
<!-- a list of appointments -->
<ListView
Margin="10"
ItemsSource="{Binding Appointments}"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<ListView.View>
<GridView>
<!-- name -->
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="Name" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- start time -->
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="StartTime" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding StartTime}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- end time -->
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="EndTime" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding EndTime}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Window>