gpt4 book ai didi

c# - 如何在 Blazor 中使用 SELECT 组件进行双向绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 00:59:09 27 4
gpt4 key购买 nike

我正在尝试写一个 Blazor 组件 使用 <select...> , 更新从父级传入的变量。
我想单击下拉菜单(选择/选项),选择一个选项,然后自动更新父项中的变量。
如果我不使用组件,我可以让它工作。但是我可以让它从组件中工作的唯一方法是,如果我还在组件中使用一个按钮(请参阅组件代码中的按钮)。但最终会有几个组件从同一个父级调用。为每个组件设置一个单独的按钮是不切实际的。所以按钮必须消失。
@绑定(bind) 对选择使用“onchange”参数,因此甚至无法编译。
我试过 CascadingValue/CascadingParam 但这也不会更新父值(除非我使用按钮......)
这是 parent :

@page "/test"
@page "/test/{param}"

@namespace ComponentTest.Pages

@using System.Web
@using ComponentTest.Pages

<h3>Test Page</h3>

<div class="border col-3">
<h4>Parent</h4>
<hr />
<label for="parentValue">Parent Value</label>
<input id="parentValue" @bind="@param"/>
</div>
<div class="col-3">&nbsp</div>
<div class="border col-3">
<h4>Component Select</h4>
<hr />
<SelectComponent @bind-Item="@param"/>
</div>

@code {
[Parameter]
public string param { get; set; }
}
这是组件:
@using System.Collections.Generic
@using System.Web

<div class="form-group">
<p>Component Value = @Item</p>
<label for="Site" class="font-weight-bold form-check-label">List</label>
@if (list == null)
{
<input id="Item" class="form-control-sm" @bind="@Item" />
}
else
{
<select id="Item" class="form-control-sm" @bind="@Item">
@foreach (var l in list)
{
@if (Item != null && String.Equals(l, Item, StringComparison.OrdinalIgnoreCase))
{
<option selected value="@l">@l</option>
}
else
{
<option value="@l">@l</option>
}
}
</select>
}
</div>
<button @onclick="UpdateParentsItem" class="btn btn-primary">Update Parent</button>
@code {
public IEnumerable<string> list = new List<string>()
{
"Item 1",
"Item 2",
"Item 3",
"Item 4",
"Item 5"
};

[Parameter]
public string Item { get; set; }

[Parameter]
public EventCallback<string> ItemChanged { get; set; }

private async Task UpdateParentsItem()
{
await ItemChanged.InvokeAsync(Item);
}
}
我遵循了一些 groovy 示例来实现事件,但我发现没有一个能够真正解决问题。

最佳答案

此代码段正在运行。试试看... 运行代码并开始输入单词 Item 3。当您输入时,您将看到子组件和父组件显示的类型文本。当您完成键入 Item 3 时,您会注意到文本 Item 3 显示在组合框中。从组合框中选择一个项目,它将出现在父级的输入框中。

选择组件.razor

    <div style="border:solid 1px red">
<select id="Item" class="form-control-sm" @bind="@Item">
@foreach (var l in list)
{
@if (Item != null && String.Equals(l, Item,
StringComparison.OrdinalIgnoreCase))
{
<option selected value="@l">@l</option>
}
else
{
<option value="@l">@l</option>
}
}
</select>

</div>
<p>@Item</p>

@code {
public IEnumerable<string> list = new List<string>()
{
"Item 1",
"Item 2",
"Item 3",
"Item 4",
"Item 5"
};


private string item { get; set; }

[Parameter]
public string Item
{
get { return item; }
set
{
if (item != value)
{
item = value;
if (ItemChanged.HasDelegate)
{
ItemChanged.InvokeAsync(value);
}
}
}
}

[Parameter]
public EventCallback<string> ItemChanged { get; set; }
}

测试 Razor
@page "/test"

<div>

<label for="parentValue">Parent Value</label>

<input type="text" id="parentValue" @bind="@Param"
@bind:event="oninput" />

<p>@Param</p>
</div>

<div>

<SelectComponent @bind-Item="@Param"/>
</div>

@code {
[Parameter]
public string Param { get; set; } = string.Empty;

}

祝你好运...如果有不清楚的地方,请随时问...

关于c# - 如何在 Blazor 中使用 SELECT 组件进行双向绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60218637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com