You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中RadzenDataList内RadzenTextBox双向绑定失效问题求助

问题分析与解决方案

这个问题我之前也碰到过,你当前的绑定方式不可行,核心原因和解决办法我给你拆解下:

为什么双向绑定失效?

字符串是值类型,当你在RadzenDataList模板里绑定@bind-Value="@item"时,实际上绑定的是该字符串的副本,而非原列表中对应的元素。你修改文本框内容时,只是修改了这个副本的值,原列表里的元素根本没被更新;当焦点切换触发组件重新渲染时,RadzenDataList又会从原列表读取旧值,所以就出现了“内容重置”的现象。

两种可行的解决办法

方案1:改用引用类型的模型(推荐)

把原本的字符串列表换成包含字符串属性的引用类型对象列表,这样绑定的是对象的属性(引用传递),修改时会直接更新原列表中的对象。

首先定义一个简单的模型类:

public class BoardItem
{
    public string Content { get; set; }
}

然后把你的数据源_retrospectiveBoard.WhatWentWell改成List<BoardItem>类型,最后修改绑定代码:

<RadzenDataList Data="@_retrospectiveBoard.WhatWentWell" TItem="BoardItem">
    <Template Context="item">
        <RadzenCard>
            <RadzenTextBox @bind-Value="@item.Content"/>
        </RadzenCard>
    </Template>
</RadzenDataList>

这样双向绑定就能正常工作,修改文本框内容时会直接同步到原列表中。

方案2:拦截Change事件手动更新原列表

如果不想修改数据源的类型,可以通过监听RadzenTextBox的Change事件,手动找到当前项在列表中的位置并更新原列表。

代码示例:

<RadzenDataList Data="@_retrospectiveBoard.WhatWentWell" TItem="string">
    <Template Context="item">
        <RadzenCard>
            <RadzenTextBox 
                Value="@item" 
                Change="@((string newValue) => UpdateList(item, newValue))"/>
        </RadzenCard>
    </Template>
</RadzenDataList>

@code {
    private void UpdateList(string oldValue, string newValue)
    {
        var targetIndex = _retrospectiveBoard.WhatWentWell.IndexOf(oldValue);
        if (targetIndex != -1)
        {
            _retrospectiveBoard.WhatWentWell[targetIndex] = newValue;
            // 若使用Blazor Server,可能需要手动调用StateHasChanged()触发渲染
            // StateHasChanged();
        }
    }
}

⚠️ 注意:如果列表中存在重复的字符串,IndexOf只会匹配第一个出现的项,这种场景下方案1会更可靠。

内容的提问来源于stack exchange,提问作者HankTheTank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:04:10