Blazor select 类组件不更新数据源中的值
Blazor select-like component does not update value in data source
在我的 Blazor Webassembly(客户端)3.2.0 应用程序中,我在页面上有很多以下 select
元素,它们创建了一个组合框,列出了 enum
:
<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
组件存储了它自己的那个值的副本,而不是写回它,但我认为绑定为我解决了这个问题。
有什么(更简单的)方法可以让这个组合框组件正常工作吗?我的错误在哪里(在理解绑定方面)?
通过稍微改写我的问题找到我的答案(抱歉,还没有习惯所有 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; }
}
在我的 Blazor Webassembly(客户端)3.2.0 应用程序中,我在页面上有很多以下 select
元素,它们创建了一个组合框,列出了 enum
:
<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
组件存储了它自己的那个值的副本,而不是写回它,但我认为绑定为我解决了这个问题。
有什么(更简单的)方法可以让这个组合框组件正常工作吗?我的错误在哪里(在理解绑定方面)?
通过稍微改写我的问题找到我的答案(抱歉,还没有习惯所有 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; }
}