Я искал SO, и есть несколько вопросов и ответов на эту тему, но ни один не решает эту конкретную проблему c.
Я пытаюсь написать компонент Blazor , который использует <select...>
, чтобы обновить переменную, переданную от родителя.
Я хочу щелкнуть раскрывающийся список (выбрать / опции), выбрать параметр и автоматически обновить переменную в родительском элементе.
Я могу заставить его работать, если я не использую компонент. Но единственный способ заставить его работать с компонентом - это использовать кнопку в компоненте (см. Кнопку в коде компонента). Но в конце концов будет несколько компонентов, вызванных из одного и того же родителя. Было бы непрактично иметь отдельную кнопку для каждого компонента. Таким образом, кнопка должна go прочь.
@ bind использует параметр "onchange" для выбора, так что он даже не скомпилируется.
I пробовал 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);
}
}
Я следовал нескольким groovy примерам реализации событий, но ни один из найденных мною действительно не решил проблему.