У меня есть сетка данных, в которой при выборе строки эта строка будет сохранена как объект rSelect с @bind-Value. Чтобы иметь возможность редактировать объект, я @bind-ValuerSelect использую select, где каждый выбор имеет значение идентификатора, но отображает имя. Теперь я хочу, чтобы он отображал идентификатор и имя объекта с этим идентификатором, которое будет отображаться в MudField ниже. Изучив документацию, я решил использовать ValueChanged, но он не работает с @bind-Value, что мне делать?
<MudItem xs = "6" md = "6">
<MudSelect T = "string" ReadOnly = "@_readonly" Dense = "true" @bind-Value = "@rSelect.Manvcongno" Label = "ID" Variant = "Variant.Outlined">
@foreach(var nv in nhanviens)
{
<MudSelectItem Value = "@nv.id">@nv.Name</MudSelectItem>
}
</MudSelect>
</MudItem>
<MudItem xs = "6" md = "6">
<MudField Variant = "Variant.Outlined" Label = "Name"></MudField>
</MudItem>

Вы не можете использовать @bind-Value и ValueChanged вместе, поскольку bind-Value также использует ValueChanged. Вместо этого, если вы хотите использовать ValueChanged, используйте Value
<MudSelect T = "string" Value = "@rSelect.Manvcongno" ValueChanged = "ManvcongnoChanged" ... >
private void ManvcongnoChanged(string? value)
{
rSelect.Manvcongno = value;
}
Но вы также можете привязать выбранный объект nhanvien вместо его имени.
<MudSelect T = "{TypeOfrSelect}" @bind-Value = "@rSelect" ToStringFunc = "x => x.Name">
@foreach(var nv in nhanviens)
{
<MudSelectItem Value = "@nv">@nv.Name</MudSelectItem>
}
</MudSelect>
С помощью ToStringFunc вы можете определить, как будет отображаться выбранный объект.
Вот фрагмент для обоих случаев Фрагмент MudBlazor
@bind-Value:after существует для этой цели. Он вызывается после обновления связанного значения.
<MudItem xs = "6" md = "6">
<MudSelect T = "string" ReadOnly = "@_readonly" Dense = "true" @bind-Value = "@rSelect.Manvcongno" @bind-Value:after = "this.OnAfterChanged" Label = "ID" Variant = "Variant.Outlined">
@foreach(var nv in nhanviens)
{
<MudSelectItem Value = "@nv.id">@nv.Name</MudSelectItem>
}
</MudSelect>
</MudItem>
<MudItem xs = "6" md = "6">
<MudField Variant = "Variant.Outlined" Label = "Name"></MudField>
</MudItem>
//.....
private void OnAfterChanged()
{
// rSelect.Manvcongno has the new value here
// do what you want
}
Я добавил {@bind-Value:after = "this.updateNhanvien"}, а также написал функцию "public void updateNhanvien(string name){}", однако получаю ошибку "невозможно преобразовать из "группы методов" в "System. Действие' ". Что я должен делать?
Посмотрите на подпись OnAfterChanged: аргументов нет. public void updateNhanvien(){}. Привязка устанавливает rSelect.Manvcongno перед вызовом делегата after. Вы получаете значение от rSelect.Manvcongno.
Отношения здесь двусторонние: любое изменение значения select или значения привязки повлияет на другое. Я вижу, что ваше решение — это только односторонние отношения. Есть ли другой путь?