using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; namespace BS.Shared.Core { 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() { this._Comparer = pComparer; this.Sort(); } public ObservableSortCollection(IEnumerable pList, Comparison pComparer) : this(pList) { this._Comparer = pComparer; this.Sort(); } public override event NotifyCollectionChangedEventHandler CollectionChanged { add { this._ChangedHandler.Add(value); base.CollectionChanged += value; } remove { this._ChangedHandler.Remove(value); base.CollectionChanged -= value; } } public void Sort() { if (this._Comparer != null) { this.DisconnectHandler(); List lTemp = this.ToList(); lTemp.Sort(this._Comparer); for (int i = 0; i < this.Count; i++) { this[i] = lTemp[i]; } this.ReconnectHandler(); this.NotifyHandlerAfterSort(); } } public void Sort(Comparison pComparer) { this.DisconnectHandler(); List lTemp = this.ToList(); lTemp.Sort(pComparer); for (int i = 0; i < this.Count; i++) { this[i] = lTemp[i]; } this.ReconnectHandler(); this.NotifyHandlerAfterSort(); } private void DisconnectHandler() { foreach (var iHandler in this._ChangedHandler) { base.CollectionChanged -= iHandler; } } private void NotifyHandlerAfterSort() { foreach (var iHandler in this._ChangedHandler) { iHandler(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } private void ReconnectHandler() { foreach (var iHandler in this._ChangedHandler) { base.CollectionChanged += iHandler; } } } }