0

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.

using snoop 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>
goldcode
  • 633
  • 8
  • 21

0 Answers0