using System.Collections.ObjectModel; namespace TheXamlGuy.TaskbarGroup.Core { public class ObservableCollectionViewModel : ObservableCollection, IDisposable where TItemViewModel : class { private readonly IDisposer disposer; private readonly IMessenger messenger; private readonly IServiceFactory serviceFactory; public ObservableCollectionViewModel(IMessenger messenger, IServiceFactory serviceFactory, IDisposer disposer) { this.messenger = messenger; this.serviceFactory = serviceFactory; this.disposer = disposer; } public bool IsInitialized { get; protected set; } public void Add() { var item = serviceFactory.Create(); disposer.Add(this, item); base.Add(item); } public void Add(object parameter, params object[] parameters) { var item = serviceFactory.Create(new[] { parameter }.Concat(parameters)); disposer.Add(this, item); base.Add(item); } public new void Clear() { foreach (var item in this) { disposer.Dispose(item); } base.Clear(); } public void Dispose() { OnDisposing(); disposer.Dispose(this); GC.SuppressFinalize(this); } public void Initialize() { if (IsInitialized) { return; } IsInitialized = true; OnInitialize(); } public void Insert(params object[] parameters) where TItem : TItemViewModel { var item = serviceFactory.Create(parameters); disposer.Add(this, item); base.Add(item); } public new void Insert(int index, TItemViewModel item) { disposer.Add(this, item); base.Insert(index, item); } public void Insert(int index, params object[] parameters) where TItem : TItemViewModel { var item = serviceFactory.Create(parameters); disposer.Add(this, item); base.Insert(index, item); } public void Insert(TItemViewModel item) { base.Insert(0, item); disposer.Add(item); } public new void Remove(TItemViewModel item) { disposer.Dispose(item); base.Remove(item); } protected virtual void OnDisposing() { } protected virtual void OnInitialize() { } protected void Publish(TEvent @event) { messenger.Send(@event); } protected void Publish() where TEvent : new() { messenger.Send(); } protected void Register(Action action) { disposer.Add(this, messenger.Subscribe(action)); } protected void Register(Action action, Func condition) { disposer.Add(this, messenger.Subscribe(action, null, condition)); } } }