@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); } }