livia-test/Livia/ViewModels/Utility/SelectableObservableCollection.cs
2025-03-28 14:31:53 +08:00

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; }= [];
}