59 lines
1.3 KiB
C#
59 lines
1.3 KiB
C#
using System.Collections.ObjectModel;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
namespace Livia.ViewModels.Utility;
|
|
|
|
|
|
public interface ISelectableItem
|
|
{
|
|
public bool IsChecked { get; set; }
|
|
}
|
|
|
|
|
|
public class SelectableObservableCollection<T> : ObservableObject where T : ObservableObject, ISelectableItem
|
|
{
|
|
|
|
public bool? CheckBoxChecked
|
|
{
|
|
get
|
|
{
|
|
if (Items.Count == 0)
|
|
return false;
|
|
|
|
List<bool> 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<T> 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<T> Items { get; }= [];
|
|
|
|
} |