using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public partial class ObservableConfigurationCollection : ObservableCollection, IRecipient> where TConfiguration : class where TViewModel : notnull, IDisposable { private readonly TConfiguration configuration; private readonly Func read; private readonly Action write; private readonly IWritableConfiguration writer; private readonly IDispatcher dispatcher; public ObservableConfigurationCollection(IServiceProvider provider, IServiceFactory factory, IMessenger messenger, IDisposer disposer, TConfiguration configuration, IWritableConfiguration writer, Func read, Action write, TValue? value = default) : base(provider, factory, messenger, disposer, value) { this.configuration = configuration; this.writer = writer; this.read = read; this.write = write; dispatcher = provider.GetRequiredService(); Value = value; } public ObservableConfigurationCollection(IServiceProvider provider, IServiceFactory factory, IMessenger messenger, IDisposer disposer, IEnumerable items, TConfiguration configuration, IWritableConfiguration writer, Func read, Action write, TValue? value = default) : base(provider, factory, messenger, disposer, items, value) { this.configuration = configuration; this.writer = writer; this.read = read; this.write = write; dispatcher = provider.GetRequiredService(); Value = value; } public void Receive(ChangedEventArgs args) { if (args.Value is TConfiguration configuration) { dispatcher.Invoke(() => Value = read(configuration)); } } protected override void Activated() => dispatcher.Invoke(() => Value = read(configuration)); protected override void ValueChanged(TValue? value) { if (IsActive) { writer.Write(args => write(value, args)); } base.ValueChanged(value); } }