@typeparam TItem
@foreach (var item in Items)
{
if (SelectedKeys.Contains(item.Key))
{
if (ButtonSelectedTemplate != null)
{
@ButtonSelectedTemplate?.Invoke(item.DataItem)
}
else
{
}
}
else
{
if (ButtonUnselectedTemplate != null)
{
@ButtonUnselectedTemplate?.Invoke(item.DataItem)
}
else
{
}
}
}
@code {
[Parameter] public IEnumerable DataSource { get; set; }
[Parameter] public Func KeySelector { get; set; }
[Parameter] public Func LabelSelector { get; set; }
[Parameter] public IEnumerable Selected { get; set; }
[Parameter] public EventCallback> SelectedChanged { get; set; }
[Parameter] public SpaceDirection Direction { get; set; } = SpaceDirection.Horizontal;
[Parameter] public RenderFragment? ButtonSelectedTemplate { get; set; }
[Parameter] public RenderFragment? ButtonUnselectedTemplate { get; set; }
List SelectedItems = new List();
List SelectedKeys = new List();
IEnumerable> Items { get; set; } = new List>();
class CheckboxButtonGroupItem
{
public string Key { get; set; }
public string Label { get; set; }
public bool Selected { get; set; }
public T DataItem { get; set; }
}
protected override async Task OnParametersSetAsync()
{
Items = DataSource.Select(i => new CheckboxButtonGroupItem
{
Key = KeySelector.Invoke(i).ToString(),
Label = LabelSelector.Invoke(i),
Selected = false,
DataItem = i
});
}
async Task Select(CheckboxButtonGroupItem item)
{
SelectedKeys.Add(item.Key);
await UpdateSelected();
}
async Task Deselect(CheckboxButtonGroupItem item)
{
SelectedKeys.Remove(item.Key);
await UpdateSelected();
}
async Task UpdateSelected()
{
Selected = Items.Where(i => SelectedKeys.Contains(i.Key)).Select(i => i.DataItem);
if (SelectedChanged.HasDelegate)
await SelectedChanged.InvokeAsync(Selected);
}
}