@namespace LANCommander.Launcher.UI @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 Func DisableSelector { get; set; } [Parameter] public IEnumerable Selected { get; set; } [Parameter] public EventCallback> SelectedChanged { get; set; } [Parameter] public SpaceDirection Direction { get; set; } = SpaceDirection.Horizontal; [Parameter] public string? IconSelected { get; set; } = IconType.Fill.CheckCircle; [Parameter] public string? IconUnselected { get; set; } = null; [Parameter] public (string key, object value)[] ButtonProps { get; set; } = []; [Parameter] public (string key, object value)[] ButtonPropsSelected { get; set; } = []; [Parameter] public (string key, object value)[] ButtonPropsUnselected { get; set; } = []; [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 }); // Sync the incoming Selected parameter with internal state. if (Selected != null) { SelectedKeys = Selected.Select(item => KeySelector.Invoke(item).ToString()).ToList(); } } private Dictionary GetButtonAttributes(TItem item, bool selected) { var attributes = new Dictionary(); string? icon = selected ? IconSelected : IconUnselected; if (icon != null) attributes["Icon"] = icon; foreach (var buttonprop in ButtonProps ?? []) attributes.TryAdd(buttonprop.key, buttonprop.value); var props = selected ? ButtonPropsSelected : ButtonPropsUnselected; foreach (var buttonprop in props ?? []) attributes.TryAdd(buttonprop.key, buttonprop.value); if (DisableSelector?.Invoke(item) ?? false) attributes.TryAdd("Disabled", true); return attributes; } 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); } }