【发布时间】:2020-02-14 01:02:50
【问题描述】:
我正在尝试编写一个使用 <select...> 的 Blazor 组件,以更新从父级传入的变量。
我想点击下拉菜单(选择/选项),选择一个选项,然后让它自动更新父项中的变量。
如果我不使用组件,我可以让它工作。但是我可以让它从组件中工作的唯一方法是,如果我还在组件中使用一个按钮(请参阅组件代码中的按钮)。但最终会有几个组件从同一个父级调用。为每个组件设置一个单独的按钮是不切实际的。所以按钮必须消失。
@bind 使用“onchange”参数进行选择,因此甚至无法编译。
我尝试过 CascadingValue/CascadingParam 但这也不会更新父值(除非我使用按钮...)
这是父级:
@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"> </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);
}
}
我遵循了一些实现事件的常规示例,但我发现没有一个能真正解决问题。
【问题讨论】:
标签: c# html-select blazor blazor-server-side