Blazor中EventCallback<string>不生效,ValueChanged.HasDelegate恒为false怎么办
触发ValueChanged.HasDelegate始终为false的常见原因
- 父组件调用自定义控件时没有正确绑定事件
Blazor的双向绑定约定下,只有父组件使用@bind-Value="父组件属性"语法,或者手动给ValueChanged参数赋值了处理方法,ValueChanged才会有绑定的委托,HasDelegate才会返回true。如果父组件仅单向传入Value的值,没有绑定对应的变更事件,该属性自然没有关联的委托。 - 子组件的绑定逻辑存在冲突
你同时给RadzenTextBox设置了@bind-Value和自定义Change事件,@bind-Value默认会占用控件的变更事件来更新本地的Value属性,部分情况下会导致自定义的事件抛出逻辑异常。另外如果你没有声明对应的Value参数,也会打破Blazor双向绑定的命名约定,导致编译器无法自动绑定ValueChanged委托。
修复方案
- 调整父组件调用方式,必须符合双向绑定规则:
<!-- 推荐写法:双向绑定,编译器自动生成ValueChanged的绑定逻辑 --> <YourCustomTextControl @bind-Value="@yourParentProperty" /> <!-- 也可以手动绑定,效果和双向绑定一致 --> <YourCustomTextControl Value="@yourParentProperty" ValueChanged="@(val => yourParentProperty = val)" />
- 调整子组件的绑定逻辑,避免事件冲突,建议修改为单向绑定
Value,自己处理值更新和事件抛出:
<RadzenTextBox Disabled="@(IsSaving || Disabled)" Style="width: 100%" Value="@Value" Change="@OnChange" /> @code { // 必须声明对应的Value参数,和ValueChanged配对才符合Blazor双向绑定约定 [Parameter] public string Value { get; set; } [Parameter] public EventCallback<string> ValueChanged { get; set; } // 其余你自己的参数、字段保留即可 private async Task OnChange(string selectedValue) { if (string.IsNullOrEmpty(PropertyName) || string.IsNullOrEmpty(selectedValue)) return; IsSaving = true; await DealRepository.UpdateSingleField(DealId, PropertyName, selectedValue); IsSaving = false; // 先更新本地Value的值,保证内外状态一致 Value = selectedValue; if (ValueChanged.HasDelegate) await ValueChanged.InvokeAsync(selectedValue); } }
内容的提问来源于stack exchange,提问作者Letoncse
相关产品推荐
相关产品推荐

