Forum Xamarin.Forms

DataTemplate not changing in ListView with CachingStrategy=RecycleElementAndDataTemplate

igorkr_10igorkr_10 Member ✭✭✭✭

I have create a ListView with CachingStrategy=RecycleElementAndDataTemplate. I use DataTemplateSelector with 3 templates. When I set CachingStrategy=RecycleElement my templates are changing as well. But with CachingStrategy=RecycleElementAndDataTemplate templates are not changing.

<ListView ItemsSource="{Binding GroupedItems, Mode=OneWay}"
                              GroupDisplayBinding="{Binding Key, Mode=OneWay}"
                              GroupShortNameBinding="{Binding Key, Mode=OneWay}"
                            <DataTemplate x:DataType="{x:Null}">
                                    <StackLayout VerticalOptions="FillAndExpand" Margin="0" Padding="10, 5, 10, 5">
                                        <Label Text="{Binding Key, Mode=OneWay}"
                                               Style="{DynamicResource HeaderLabelStyle}"

public abstract class DocumentTemplateSelector : DataTemplateSelector
        public DataTemplate DepartmentTemplate { get; set; }

        public DataTemplate SmallDocumentTemplate { get; set; }

        public DataTemplate BigDocumentTemplate { get; set; }

        public DocumentTemplateSelector()
            this.DepartmentTemplate = new DataTemplate(typeof(DepartmentCell));
            this.SmallDocumentTemplate = new DataTemplate(typeof(SmallDocumentCell));
            this.BigDocumentTemplate = new DataTemplate(typeof(BigDocumentCell));

        protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
            DocumentListItemViewModel viewModel = (DocumentListItemViewModel)item;
            if (viewModel.IsDepartment)
                return this.DepartmentTemplate;
            if (container.BindingContext is DocumentListViewModel listViewModel)
                if (listViewModel.FullListRoot)
                    return this.BigDocumentTemplate;
            return this.SmallDocumentTemplate;

    public class RowDocumentTemplateSelector : DocumentTemplateSelector

What am I missing? How to use RecycleElementAndDataTemplate with DataTemplateSelector properly?


  • jezhjezh Member, Xamarin Team Xamurai

    public enum ListViewCachingStrategy
    RetainElement, // the default value

    The RetainElement caching strategy specifies that the ListView will generate a cell for each item in the list, and is the default ListView behavior. It should be used in the following circumstances:

    • Each cell has a large number of bindings (20-30+).
    • The cell template changes frequently.
    • Testing reveals that the RecycleElement caching strategy results in a reduced execution speed.

    And the RecycleElementAndDataTemplate caching strategy builds on the RecycleElement caching strategy by additionally ensuring that when a ListView uses a DataTemplateSelector to select a DataTemplate, DataTemplates are cached by the type of item in the list. Therefore, DataTemplates are selected once per item type, instead of once per item instance.

    And we should notice that:

    For more details about this, you can check:

    It is different for us to reproduce this problem according to your code snippets, what's the DocumentListItemViewModel , DepartmentCell and SmallDocumentCell? Could you please post a basic demo to github or onedriver so that we can test on our side?

    Xamarin forums are migrating to a new home on Microsoft Q&A!
    We invite you to post new questions in the Xamarin forums’ new home on Microsoft Q&A!
    For more information, please refer to this sticky post.

Sign In or Register to comment.