using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; namespace ChatController.Utilities.Extensions { public class ObservableSortCollection : ObservableCollection { private readonly List _ChangedHandler = new List(); private readonly Comparison _Comparer; public ObservableSortCollection() { } public ObservableSortCollection(IEnumerable pList) : base(pList.ToList()) { } public ObservableSortCollection(Comparison pComparer) : this() { _Comparer = pComparer; Sort(); } public ObservableSortCollection(IEnumerable pList, Comparison pComparer) : this(pList) { _Comparer = pComparer; Sort(); } public override event NotifyCollectionChangedEventHandler CollectionChanged { add { _ChangedHandler.Add(value); base.CollectionChanged += value; } remove { _ChangedHandler.Remove(value); base.CollectionChanged -= value; } } public void Sort() { if (!(_Comparer is null)) { DisconnectHandler(); var lTemp = this.ToList(); lTemp.Sort(_Comparer); for (var i = 0; i < Count; i++) { this[i] = lTemp[i]; } ReconnectHandler(); NotifyHandlerAfterSort(); } } public void Sort(Comparison pComparer) { DisconnectHandler(); var lTemp = this.ToList(); lTemp.Sort(pComparer); for (var i = 0; i < Count; i++) { this[i] = lTemp[i]; } ReconnectHandler(); NotifyHandlerAfterSort(); } private void DisconnectHandler() { foreach (var iHandler in _ChangedHandler) { base.CollectionChanged -= iHandler; } } private void NotifyHandlerAfterSort() { foreach (var iHandler in _ChangedHandler) { iHandler(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } private void ReconnectHandler() { foreach (var iHandler in _ChangedHandler) { base.CollectionChanged += iHandler; } } } }