Data virtualization in a WPF listbox

1.4k views Asked by At

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

1

There are 1 answers

0
Adi Lester On BEST ANSWER

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>