如何将两种方式绑定到子组件中的select-Blazor
我正在尝试将这两种方式绑定到子组件中的select元素。父项应该能够更改子项选择的选定值,并且子项选择在其更改时应该回调父项,以便能够对新值作出反应。然而,我似乎只能传递给孩子,而不能引发家长的事件 我的父组件包含一个子组件,该子组件包含一个select。父组件如下所示:如何将两种方式绑定到子组件中的select-Blazor,blazor,Blazor,我正在尝试将这两种方式绑定到子组件中的select元素。父项应该能够更改子项选择的选定值,并且子项选择在其更改时应该回调父项,以便能够对新值作出反应。然而,我似乎只能传递给孩子,而不能引发家长的事件 我的父组件包含一个子组件,该子组件包含一个select。父组件如下所示: <SelectInput @bind-Value="Selected"> @ChildContent </SelectInput&g
<SelectInput @bind-Value="Selected">
@ChildContent
</SelectInput>
@code{
[Parameter]
public string Selected { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public EventCallback<string> SelectedChanged { get; set; }
private async Task ValueChanged(string val)
{
await SelectedChanged.InvokeAsync(val);
}
}
@儿童内容
@代码{
[参数]
选定的公共字符串{get;set;}
[参数]
公共RenderFragment ChildContent{get;set;}
[参数]
公共事件回调SelectedChanged{get;set;}
私有异步任务值已更改(字符串值)
{
等待SelectedChanged.InvokeAsync(val);
}
}
不会调用ValueChanged和SelectedChanged。这是我想解决的问题
子组件是SelectInput组件:
<select value="@Value"
@onchange="OnValueChanged">
@ChildContent
</select>
@code{
[Parameter]
public string Value { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
public async Task OnValueChanged(ChangeEventArgs e)
{
Value = e.Value.ToString();
await ValueChanged.InvokeAsync(Value);
}
}
@儿童内容
@代码{
[参数]
公共字符串值{get;set;}
[参数]
公共RenderFragment ChildContent{get;set;}
公共异步任务OnValueChanged(ChangeEventArgs e)
{
Value=e.Value.ToString();
wait ValueChanged.InvokeAsync(值);
}
}
此子元素正在工作,正在调用ValueChanged回调。但是,我无法捕获父级中的回调,因为编译的代码已经调用了它,因为绑定值(我需要它,因为它也可以在此父级控件之外更改。向下绑定仍然有效,但是在这个实例中,我还需要向上绑定-或者至少捕获事件并向上传播它。
任何帮助都将不胜感激:)注意:参数属性不应进行变异。它们仅用于在组件之间流动数据。为了简单起见,我忽略了这一点 祖父母
@page/“
a型值美国、法国等:
@代码{
选择的私有字符串{get;set;}=“Germany”;
}
剃须刀
@代码{
私有字符串_值;
[参数]
公共字符串值
{
获取=>\u值;
设置
{
如果(_值!=值)
{
_价值=价值;
_=ValueChanged.InvokeAsync(_值);
}
}
}
[参数]
public EventCallback ValueChanged{get;set;}
}
选择Input.razor
美国
法国
中国
德国
@代码{
[参数]
公共字符串值{get;set;}
[参数]
public EventCallback ValueChanged{get;set;}
公共异步任务OnValueChanged(ChangeEventArgs e)
{
Value=e.Value.ToString();
wait ValueChanged.InvokeAsync(值);
}
}
非常感谢@enet!工作是一种享受。不感兴趣-这是分页控件的一部分,其中页码可以通过按钮集或选择输入(两个单独的组件)进行更改,这就是为什么我需要更改属性的原因。我们如何通过简单地向上游传播事件来做到这一点?不,不应该改变参数属性。注意:您可以定义本地字段来保存从父组件传递的参数值,然后根据需要修改这些值。但不要更改参数属性本身的值。“我们如何通过简单地向上游传播事件来做到这一点。”这就是我的代码所显示的。。。注意:当您有父子关系时,您可以在事件回调中使用组件参数。但是当关系更深时(祖父母->父->子->孙子),最好的解决方案是使用服务。我有两个答案,所以演示它…寻找它们
@page "/"
Type a value USA ,France,etc.:
<input type="text" @bind="Selected" @bind:event="oninput" />
<ParentComponent @bind-Value="Selected"></ParentComponent>
@code{
private string Selected { get; set; } = "Germany";
}
<SelectInput @bind-Value="Value"></SelectInput>
@code{
private string _value;
[Parameter]
public string Value
{
get => _value;
set
{
if(_value != value)
{
_value = value;
_ = ValueChanged.InvokeAsync(_value);
}
}
}
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
}
<select value="@Value" @onchange="OnValueChanged">
<option value="USA">USA</option>
<option value="France">France</option>
<option value="China">China</option>
<option value="Germany">Germany</option>
</select>
@code{
[Parameter]
public string Value { get; set; }
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
public async Task OnValueChanged(ChangeEventArgs e)
{
Value = e.Value.ToString();
await ValueChanged.InvokeAsync(Value);
}
}