MudTreeView 添加节点后为何无法立即选中?
数据小陈
结论
新节点加入 InitialTreeItems 后,MudTreeView 需要完成渲染,才能显示并识别该节点。如果在同一个 Add 方法里立即设置 SelectedItem,树中可能还没有对应节点,这次选中就不会生效。可以先保存待选中的值,等组件完成渲染后再设置绑定值。
相关代码如下:
@bind-SelectedValue="SelectedItem"
var treeItem = new TreeItemData<string> { Value = value, Icon = Icons.Material.Filled.Group };
InitialTreeItems.Add(treeItem);
SelectedItem = value;
之后能够手动选中同一节点,说明节点和值本身可以正常使用。更可能的原因是:设置选中值时,新节点还没渲染出来。
在渲染后设置选中值
添加节点时,先暂存它的值,再通过 OnAfterRenderAsync 设置选中项。下面的示例只处理一次待选值,避免在后续每次渲染时重复触发:
<MudTreeView T="string" Items="InitialTreeItems" @bind-SelectedValue="SelectedItem">
@* 按当前组件用法渲染树节点 *@
</MudTreeView>
private string SelectedItem = string.Empty;
private string? _pendingSelection;
private bool _selectAfterRender;
private List<TreeItemData<string>> InitialTreeItems = new();
private void Add()
{
var value = $"P{InitialTreeItems.Count}";
var treeItem = new TreeItemData<string>
{
Value = value,
Icon = Icons.Material.Filled.Group
};
InitialTreeItems.Add(treeItem);
_pendingSelection = value;
_selectAfterRender = true;
}
protected override Task OnAfterRenderAsync(bool firstRender)
{
if (_selectAfterRender && _pendingSelection is not null)
{
_selectAfterRender = false;
SelectedItem = _pendingSelection;
StateHasChanged();
}
return Task.CompletedTask;
}
Add 更新列表并记录目标值。组件完成渲染后,OnAfterRenderAsync 再更新 SelectedItem,此时绑定值就能对应到已显示的节点。示例中的 T 和 Items 写法需要符合项目所用 MudBlazor 版本的组件 API。如果现有树通过其他方式提供节点数据,不必照搬示例中的树标记。
检查节点值
每个节点的 Value 应与 SelectedItem 类型一致,并能唯一对应目标节点。示例使用 TreeItemData<string> 和字符串值,因此绑定的选中值也应是字符串。如果组件版本或树结构对节点选择另有要求,应按对应版本的 API 调整。
备注:内容仅供参考。
