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