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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:55:09