У меня есть MudSelect с включенным MultiSelection. У меня также есть MultiSelectionTextFunc, поскольку у моих SelectItems есть значение и текст. Я привязываю значение к значениям свойств моей модели. Вот фрагмент кода:
https://try.mudblazor.com/snippet/mOwyaqmnmhvriTTJ
Вышеупомянутое работает нормально и отображает значения так, как я и предполагал.
Проблема в том, что у меня уже есть некоторые значения в моем свойстве Values. Затем, хотя он и связывает правильные значения, отображает только первое:





Не знаю, в чем проблема, но это работает, пока вы устанавливаете свойство Value, даже если вы его не используете.
<MudSelect T = "int" Clearable = "true" @bind-Value = "localVal"
MultiSelectedValues = "@Vm.Values" SelectedValuesChanged = "SelectedValuesChanged"
SelectionTextFunc = "@GetMultiSelectionText" MultiSelection = "true" Label = "Select">
@foreach (var option in options)
{
<MudSelectItem T = "int" Value = "@option.Value">@option.Text</MudSelectItem>
}
</MudSelect>
@code {
int localVal;
public MyVm Vm { get; set; }
private List<Option> options = new List<Option> {new Option(1, "Option1"), new Option(2, "Option2"), new Option(3, "Options3")};
protected override void OnInitialized()
{
Vm = new MyVm
{
Values = new List<int>{1, 2}
};
base.OnInitialized();
}
private string GetMultiSelectionText(List<string> selectedValues)
{
return string.Join(", ", options.Where(x => selectedValues.Contains(x.Value.ToString())).Select(x => x.Text).ToList());
}
private void SelectedValuesChanged(IEnumerable<int> selectedValues)
{
Vm.Values = selectedValues.ToList();
}
public class MyVm
{
public List<int> Values { get; set; }
}
public class Option
{
public int Value { get; init; }
public string Text { get; init; }
public Option(int value, string text)
{
Value = value;
Text = text;
}
}
}
Демо 👉Фрагмент MudBlazor
Или с помощью обходного пути @spyros_, упомянутого в комментариях ниже, где вы создаете локальную коллекцию, то есть IEnumerable, вместо того, чтобы создавать ее как свойство объекта. Затем вы назначаете как локальную коллекцию, так и коллекцию свойств объекта в методе-обработчике SelectedValuesChanged.
<MudSelect T = "string" Clearable = "true" SelectedValues = "@initialSelectedValues" MultiSelectionTextFunc = "@GetMultiSelectionText" SelectedValuesChanged = "SelectedValuesChanged"
MultiSelection = "true" Label = "Select">
@foreach (var option in options)
{
<MudSelectItem T = "string" Value = "@option.Text">@option.Text</MudSelectItem>
}
</MudSelect>
@code {
public MyVm Vm { get; set; }
private List<Option> options = new List<Option> {new Option(1, "Option1"), new Option(2, "Option2"), new Option(3, "Options3")};
private IEnumerable<string> initialSelectedValues;
protected override void OnInitialized()
{
Vm = new MyVm
{
Values = new List<int>{1, 2}
};
initialSelectedValues = options.Where(x=>Vm.Values.Contains(x.Value)).Select(x => x.Text).ToList();
base.OnInitialized();
}
private string GetMultiSelectionText(List<string> selectedValues)
{
return string.Join(", ", options.Where(x => selectedValues.Contains(x.Text)).Select(x => x.Text).ToList());
}
private void SelectedValuesChanged(IEnumerable<string> selectedValues)
{
Vm.Values = options.Where(x=>selectedValues.Contains(x.Text)).Select(x => x.Value).ToList();
initialSelectedValues = selectedValues;
}
public class MyVm
{
public List<int> Values { get; set; }
}
public class Option
{
public int Value { get; init; }
public string Text { get; init; }
public Option(int value, string text)
{
Value = value;
Text = text;
}
}
}
Спасибо за быстрый ответ! Я этого не ожидал, поэтому применил такой обходной путь: try.mudblazor.com/snippet/GuGIOAQRptRLXPfB