PAYATHON 2026

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 调整。

备注:内容仅供参考。