Blazor绑定类列表到输入时自定义Checkbox死循环及set访问器不触发问题
Blazor绑定问题原因与解决方案
问题1:checkboxes属性set访问器不触发
- 原因:你修改的是
List<CheckboxModel>内部元素的isSelected属性,没有替换checkboxes对应的整个List实例引用,只有当你给checkboxes直接赋值新的List对象时,set访问器才会执行。 - 解决方案:如果需要监听选中项变更,可选择以下两种方式:
- 给
CheckboxModel实现INotifyPropertyChanged接口,监听isSelected属性的变更事件 - 绑定选中变更事件,每次选中状态变化时手动执行你原本写在set里的逻辑
- 给
问题2:自定义Checkbox组件死循环+数据不更新
- 原因:自定义Checkbox的参数逻辑不符合Blazor双向绑定规范:
isSelected参数的setter里没有给私有字段_isSelected赋值,导致组件内部存储的选中状态永远不会更新,界面自然无变化- 只要父组件给
isSelected参数赋值,setter就直接触发isSelectedChanged回调,父组件收到回调后更新绑定源,触发重渲染,再次给子组件isSelected赋值,形成无限循环
- 修复后的
Checkbox.razor代码:
<div class="checkbox"> <input type="checkbox" id="@id" @bind="@IsSelected" /> <label for="@id">@label</label> </div> @code { [Parameter] public string id { get; set; } [Parameter] public string label { get; set; } private bool _isSelected; [Parameter] public bool IsSelected { get => _isSelected; set { if (_isSelected != value) { _isSelected = value; isSelectedChanged.InvokeAsync(value); } } } [Parameter] public EventCallback<bool> isSelectedChanged { get; set; } }
内容的提问来源于stack exchange,提问作者j.xiang
相关产品推荐
相关产品推荐

