Есть ли решение, когда @bind-Value и ValueChanged не работают вместе?

У меня есть сетка данных, в которой при выборе строки эта строка будет сохранена как объект 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>
Для развертывания Сайтов с использованием Blazor, Angular и React с репозиторием на GitHub на Cloudflare
Для развертывания Сайтов с использованием Blazor, Angular и React с репозиторием на GitHub на Cloudflare
Как развернуть сайты с помощью Blazor, Angular и React с репозиторием на GitHub на Cloudflare.
1
0
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете использовать @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

Отношения здесь двусторонние: любое изменение значения select или значения привязки повлияет на другое. Я вижу, что ваше решение — это только односторонние отношения. Есть ли другой путь?

Perfeitor 09.07.2024 11:41
Ответ принят как подходящий

@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. Действие' ". Что я должен делать?

Perfeitor 09.07.2024 11:45

Посмотрите на подпись OnAfterChanged: аргументов нет. public void updateNhanvien(){}. Привязка устанавливает rSelect.Manvcongno перед вызовом делегата after. Вы получаете значение от rSelect.Manvcongno.

MrC aka Shaun Curtis 09.07.2024 13:23

Другие вопросы по теме