In Development
Last Updated: 05 Mar 2026 12:12 by ADMIN
Scheduled for 2026 Q2
Kris
Created on: 04 Mar 2026 13:42
Category: TreeView
Type: Bug Report
1
Breaking change in 13.0.0 TreeView checkbox selection behavior

There is an undocumented breaking change in the selection behavior of the v13.0.0 TreeView component that prevents us from upgrading from v12.3.0.

In v12.3.0, selecting a TreeView checkbox does change the TreeView item selection or trigger the selection change events. In v13.0.0, checking an item does also change the selection. The v12.3.0 behavior is important for our implementation because selecting a TreeView item in our application fetches data from a database and we do not want the performance overhead of those calls when checking an item---we want the user to be able to select multiple items and only then explicitly fetch the data for all of them.

I've created a minimal example here: https://blazorrepl.telerik.com/cqYdEePd40Zq3ava43. You can see the behavior differences when switching between versions.

Please let me know if there's any additional information we can provide. A workaround to this behavior would be appreciated. Thank you!

1 comment
ADMIN
Dimo
Posted on: 05 Mar 2026 09:51

Hello Kris,

Thanks for the runnable test page. I think the issue is a side effect of code changes that we made during the implementation of the DropDownTree component, which reuses the TreeView internally. This is a regression, rather than a breaking change. Please excuse us for the unexpected trouble.

I am converting your ticket to a public bug report and awarding you Telerik points. You will receive automatic updates on status change. 

Here is a test page with a workaround. I hope it's acceptable for you.

<h3>Without Workaround</h3>

<TelerikTreeView Data="@FlatData"
                 @bind-CheckedItems="@CheckedItems"
                 @bind-ExpandedItems="@ExpandedItems"
                 @bind-SelectedItems="@SelectedItems"
                 CheckBoxMode="@TreeViewCheckBoxMode.Multiple"
                 SelectionMode="@TreeViewSelectionMode.Multiple" />

<h3>With Workaround</h3>

<TelerikTreeView Data="@FlatData"
                 CheckedItems="@CheckedItems"
                 CheckedItemsChanged="@TreeViewCheckedItemsChanged"
                 @bind-ExpandedItems="@ExpandedItems"
                 SelectedItems="@SelectedItems"
                 SelectedItemsChanged="@TreeViewSelectedItemsChanged"
                 CheckBoxMode="@TreeViewCheckBoxMode.Multiple"
                 SelectionMode="@TreeViewSelectionMode.Multiple" />

@code {
    private IEnumerable<TreeItem> FlatData { get; set; } = new List<TreeItem>();
    private IEnumerable<object> CheckedItems { get; set; } = new List<TreeItem>();
    private IEnumerable<object> ExpandedItems { get; set; } = new List<TreeItem>();
    private IEnumerable<object> SelectedItems { get; set; } = new List<TreeItem>();

    private bool ShouldAllowSelectionChange { get; set; } = true;

    private Random rnd { get; set; } = new Random();

    private async Task TreeViewCheckedItemsChanged(IEnumerable<object> newCheckedItems)
    {
        CheckedItems = newCheckedItems;
        ShouldAllowSelectionChange = false;
    }

    private async Task TreeViewSelectedItemsChanged(IEnumerable<object> newSelectedItems)
    {
        // Use only if TreeViewSelectedItemsChanged executes before ТreeViewCheckedItemsChanged
        //await Task.Delay(1);

        if (ShouldAllowSelectionChange)
        {
            SelectedItems = newSelectedItems;
        }
        else
        {
            ShouldAllowSelectionChange = true;
        }
    }

    protected override void OnInitialized()
    {
        FlatData = LoadFlat();

        ExpandedItems = FlatData.Where(x => x.HasChildren == true);
    }

    #region TreeView data generation

    private int TreeLevels { get; set; } = 2;
    private int ItemsPerLevel { get; set; } = 2;
    private int IdCounter { get; set; } = 1;

    private List<TreeItem> LoadFlat()
    {
        List<TreeItem> items = new List<TreeItem>();

        PopulateTreeItems(items, null, 1);

        return items;
    }

    private void PopulateTreeItems(List<TreeItem> items, int? parentId, int level)
    {
        for (int i = 1; i <= ItemsPerLevel; i++)
        {
            var itemId = IdCounter++;
            items.Add(new TreeItem()
            {
                Id = itemId,
                Text = $"Level {level} Item {i} Id {itemId}",
                ParentId = parentId,
                HasChildren = level < TreeLevels
            });

            if (level < TreeLevels)
            {
                PopulateTreeItems(items, itemId, level + 1);
            }
        }
    }

    #endregion

    public class TreeItem
    {
        public int Id { get; set; }
        public int? ParentId { get; set; }
        public bool HasChildren { get; set; }
        public string Text { get; set; } = string.Empty;
        public object? Icon { get; set; }
    }
}

 

Regards,
Dimo
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.