I am using a TreeView control that displays checkboxes for each node and the checked state of each node seems to get lost when the parent node is collapsed and expanded again. However, this only seems to happen when the OnExpand event is handled. Remove the OnExpand event handler and everything works as expected. It doesn't seem to make a difference if the event args property ShouldRender is set to true. Happens for both flat and hierarchical data.
Can't imagine that this is the desired behaviour. If it is then is there any way around it as I do need to handle the OnExpand event in my code behind.
The following is test page the displays this problem...
@page "/treeview"
@using System.Linq
<TelerikTreeView Data="@Data" CheckBoxMode="@TreeViewCheckBoxMode.Multiple" CheckChildren="true" CheckParents="true"
@bind-CheckedItems="@CheckedItems" OnExpand="@OnExpandHandler">
@*@bind-ExpandedItems="@ExpandedItems"*@
<TreeViewBindings>
<TreeViewBinding IdField="Id" TextField="Text" HasChildrenField="HasChildren" ItemsField="Children">
<ItemTemplate>
@{
var item = context as MyTreeItem;
<div>@item.Id.ToString() : @item.Text</div>
}
</ItemTemplate>
</TreeViewBinding>
</TreeViewBindings>
</TelerikTreeView>
@code {
private IEnumerable<MyTreeItem> Data { get; set; }
private IEnumerable<object> CheckedItems { get; set; } = Enumerable.Empty<object>();
private IEnumerable<object> ExpandedItems { get; set; } = Enumerable.Empty<object>();
private int LastID = 0;
protected override void OnInitialized()
{
Data = CreateNodeList("one", "two", "three", 3);
}
private List<MyTreeItem> CreateNodeList(string name1, string name2, string name3, int levels = 0)
{
var list = new List<MyTreeItem>();
list.Add(CreateNode(name1, levels));
list.Add(CreateNode(name2, levels));
list.Add(CreateNode(name3, levels));
return list;
}
private MyTreeItem CreateNode(string name, int levels)
{
LastID++;
var node = new MyTreeItem { Id = LastID, Text = name };
if (levels > 0)
{
node.Children = CreateNodeList($"{name} - one", $"{name} - two", $"{name} - three", levels - 1);
}
return node;
}
private async Task OnExpandHandler(TreeViewExpandEventArgs args)
{
//await InvokeAsync(StateHasChanged);
//args.ShouldRender = true;
}
private class MyTreeItem
{
public int Id { get; set; } = 0;
public string Text { get; set; } = "";
public IList<MyTreeItem> Children { get; set; } = null;
public bool HasChildren => Children is not null && Children.Count > 0;
}
}