快速回答
Quoting Blazor 文档:
元件参数
绑定识别组件参数,其中@bind-{property}可以跨组件绑定属性值。
对于您的页面:
<EditForm Model="model" OnValidSubmit="Submit">
<MyInputComponent @bind-BindingValue="model.Name" />
</EditForm>
子组件MyInputComponent
:
<div>
<InputText type="text" @bind-Value="@BindingValue" />
</div>
@code {
private string _value;
[Parameter]
public string BindingValue
{
get => _value;
set
{
if (_value == value ) return;
_value = value;
BindingValueChanged.InvokeAsync(value);
}
}
[Parameter]
public EventCallback<string> BindingValueChanged { get; set; }
}
Notice
- 您应该通过以下方式引发子组件的绑定更改
EventCallback<string> BindingValueChanged
.
- I chose
BindingValue
and BindingValueChanged
作为标识符,但是,您可以只使用Value
and ValueChanged
。那么将会是:<MyInputComponent @bind-Value="model.Name" />
在 BlazorFiddle 尝试一下.
(2022 年编辑)完整记录现在位于:与组件参数绑定
已编辑:请参阅下面的选项 2 以获取干净的解决方案:
您在 EditForm 内的控件
如果您想将组件放入 EditForm 并处理验证,或使用 onchange 事件执行其他操作,您应该引发EditContext.NotifyFieldChanged
。您有两种选择。
选项 1:从 EditContext 引发
你可以得到EditContext
from CascadeParameter
并调用NotifyFieldChanged
用手:
[CascadingParameter] EditContext EditContext { get; set; } = default!;
[Parameter] public Expression<Func<string>>? ValueExpression { get; set; }
#endregion
#region bindedValue
[Parameter] public EventCallback<string> ValueChanged { get; set; }
private string _value { set; get; } = "";
[Parameter]
public string Value
{
get => _value;
set
{
if (_value == value) return;
_value = value;
ValueChanged.InvokeAsync(value);
var fieldIdentifier = FieldIdentifier.Create(ValueExpression);
EditContext.NotifyFieldChanged(fieldIdentifier);
}
}
选项2(推荐):通过从InputBase继承
你可以继承自InputBase<string>
并执行TryParseValueFromString
. InputBase
将为您做这项工作,当您继承时InputBase你有Value
, ValueChanged
, EditContext
, etc.
protected override bool TryParseValueFromString(string? value, out string result, [NotNullWhen(false)] out string? validationErrorMessage)
{
result = value ?? "";
validationErrorMessage = null;
return true;
}