У меня есть сетка данных, в которой при выборе строки эта строка будет сохранена как объект rSelect
с @bind-Value
. Чтобы иметь возможность редактировать объект, я @bind-Value
rSelect
использую 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 или значения привязки повлияет на другое. Я вижу, что ваше решение — это только односторонние отношения. Есть ли другой путь?