类似 Blazor select 的组件不会更新数据源中的值 [duplicate]

Blazor select-like component does not update value in data source [duplicate]

提问人:Ray 提问时间:7/3/2020 最后编辑:Ray 更新时间:7/3/2020 访问量:1119

问:

在我的 Blazor Webassembly(客户端)3.2.0 应用程序中,我的页面上有很多以下元素,它们创建一个组合框,列出以下可用项:selectenum

<select @bind="SomeEnumValue">
    @foreach (var element in Enum.GetValues(typeof(SomeEnum)))
    {
        <option value="@element">@element</option>
    }
</select>

虽然这可行,但我想防止对每个这样的组合框一遍又一遍地重复自己,并考虑创建以下组件:EnumSelect

@typeparam T
<select @bind="Value">
    @foreach (var element in Enum.GetValues(typeof(@T)))
    {
        <option value="@element">@element</option>
    }
</select>

@code {
    [Parameter]
    public T Value { get; set; } = default(T)!;

    [Parameter]
    public EventCallback<T> ValueChanged { get; set; }
}

然后像这样使用它:

<EnumSelect T="SomeEnum" @bind-Value="SomeEnumValue" />

但是,虽然属性和枚举项的显示有效,但在从组合框中选择其他项时,不会写回该属性。SomeEnumValue

我不确定为什么这不起作用。我有点怀疑组件存储了该值的自己的副本,而不是将其写回,但我认为绑定为我解决了这个问题。EnumSelect

有没有(更简单的)方法可以让这个组合框组件工作?我的错误在哪里(在理解绑定方面)?

C# 数据绑定 Blazor 客户端

评论


答:

1赞 Ray 7/3/2020 #1

通过稍微改写我的问题找到了我的答案(对不起,尚未习惯所有 Blazor 术语): 自定义组件上的 Blazor 双向绑定

如果我的问题,最终的工作组件如下所示: 检查属性内的值是否实际更改是必需的,或者我挂起了我的应用程序(可能是因为它想一遍又一遍地设置它?

@typeparam T
<select @bind="Value">
    @foreach (var element in Enum.GetValues(typeof(@T)))
    {
        <option value="@element">@element</option>
    }
</select>

@code {
    private T _value = default(T)!;

    [Parameter]
    public T Value
    {
        get => _value;
        set
        {
            if (_value.Equals(value))
                return;

            _value = value;
            ValueChanged.InvokeAsync(_value);
        }
    }

    [Parameter]
    public EventCallback<T> ValueChanged { get; set; }
}