wpflistboxvirtualizationlistboxitemsdata-virtualization

Data virtualization in a WPF listbox


I have a scenario where in I populate a listbox with a 1000 items. I set the ItemsSource property with a source of data.

I have a requirement where I need to strike out an item of the listbox based on certain criteria, when the UI loads. I am using styles + attached properties to achieve the same by setting ContentTemplate of ListBoxItem in the callback method of attached property.

My problem is when I try to generate a ListBoxItem using ItemContainerGenerator.ContainerFromItem, for an item which is at the end of the list, I get null. As a result, I cannot strike out items of the listbox which are at the bottom of the list.

Has it got something to do with virtualization. I want to obtain all those ListBoxItems on load.

Is there any workaround?

Thanks


Solution

  • This is definitely caused by virtualization. This is exactly what UI virtualization is supposed to do - only create ListBoxItem objects for items that are visible on the screen. You can easily see that this is indeed the cause by setting VirtualizingStackPanel.IsVirtualizing = false on your ListBox and see that ItemContainerGenerator.ContainerFromItem no longer returns null.

    You can set a style for your ListBoxItems in your ListBox that will have the logic to strike out the items as needed. This should also work when virtualization is enabled. For example:

    <ListBox>
        <ListBox.Resources>
            <Style TargetType=ListBoxItem>
                ...
            </Style>
        </ListBox.Resources>
    </ListBox>