如何将两种方式绑定到子组件中的select-Blazor

如何将两种方式绑定到子组件中的select-Blazor,blazor,Blazor,我正在尝试将这两种方式绑定到子组件中的select元素。父项应该能够更改子项选择的选定值,并且子项选择在其更改时应该回调父项,以便能够对新值作出反应。然而,我似乎只能传递给孩子,而不能引发家长的事件 我的父组件包含一个子组件,该子组件包含一个select。父组件如下所示: <SelectInput @bind-Value="Selected"> @ChildContent </SelectInput&g

我正在尝试将这两种方式绑定到子组件中的select元素。父项应该能够更改子项选择的选定值,并且子项选择在其更改时应该回调父项,以便能够对新值作出反应。然而,我似乎只能传递给孩子,而不能引发家长的事件

我的父组件包含一个子组件,该子组件包含一个select。父组件如下所示:

        <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);
    }
}