using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; namespace Livia.ViewModels.Utility; public interface ISelectableItem { public bool IsChecked { get; set; } } public class SelectableObservableCollection : ObservableObject where T : ObservableObject, ISelectableItem { public bool? CheckBoxChecked { get { if (Items.Count == 0) return false; List selected = Items.Select(item => item.IsChecked).Distinct().ToList(); return selected.Count == 1 ? selected.Single() : null; } set { if (!value.HasValue) return; foreach (T item in Items) { item.IsChecked = value.Value; } OnPropertyChanged(); } } public void AddRange(IEnumerable list) { foreach (T item in list) { Items.Add(item); item.PropertyChanged += (_, args) => { if (args.PropertyName != nameof(item.IsChecked)) return; OnPropertyChanged(nameof(CheckBoxChecked)); }; } //refresh after adding new stuff OnPropertyChanged(nameof(CheckBoxChecked)); } public ObservableCollection Items { get; }= []; }