Blazor组件嵌套双向绑定问题:子组件输入未同步至父组件
Blazor子组件引用类型属性同步问题解决
问题核心:你绑定的是Value.Signature(引用类型的内部属性),但Blazor双向绑定默认只检测参数引用是否变化,不会自动感知内部属性的修改,因此父组件无法收到更新通知。
以下是两种可行的修复方案:
方案一:局部变量中转+变更后触发回调
修改Child.razor代码:
<InputText class="form-control" @bind-Value="_signature" @bind-Value:after="OnSignatureChanged" /> @code{ [Parameter] public Registration? Value { get; set; } [Parameter] public EventCallback<Registration?> ValueChanged { get; set; } private string? _signature; protected override void OnParametersSet() { // 从父组件传入的Value初始化局部变量 _signature = Value?.Signature; } private async Task OnSignatureChanged() { if (Value is not null) { // 更新原对象的Signature属性 Value.Signature = _signature; // 手动触发ValueChanged,通知父组件数据已更新 await ValueChanged.InvokeAsync(Value); } } }
方案二:直接绑定输入框事件处理
修改Child.razor代码:
<InputText class="form-control" Value="@Value?.Signature" @oninput="OnInputChanged" /> @code{ [Parameter] public Registration? Value { get; set; } [Parameter] public EventCallback<Registration?> ValueChanged { get; set; } private async Task OnInputChanged(ChangeEventArgs e) { if (Value is not null) { Value.Signature = e.Value?.ToString(); // 触发回调通知父组件 await ValueChanged.InvokeAsync(Value); } } }
说明:
- 两种方案的核心都是手动调用
ValueChanged.InvokeAsync(Value),强制通知父组件数据发生了变化。 - 无需保留
ValueExpression参数(除非你需要在子组件中使用表单验证相关的表达式功能),当前场景下它不是必须的。
内容的提问来源于stack exchange,提问作者EyeSeeSharp
相关产品推荐
相关产品推荐

