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
相关产品推荐
相关产品推荐

