106 lines
2.7 KiB
C#
106 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.Specialized;
|
|
using System.Linq;
|
|
|
|
namespace ChatController.Utilities.Extensions
|
|
{
|
|
public class ObservableSortCollection<T> : ObservableCollection<T>
|
|
{
|
|
private readonly List<NotifyCollectionChangedEventHandler> _ChangedHandler = new List<NotifyCollectionChangedEventHandler>();
|
|
|
|
private readonly Comparison<T> _Comparer;
|
|
|
|
public ObservableSortCollection()
|
|
{
|
|
}
|
|
|
|
public ObservableSortCollection(IEnumerable<T> pList) : base(pList.ToList())
|
|
{
|
|
}
|
|
|
|
public ObservableSortCollection(Comparison<T> pComparer) : this()
|
|
{
|
|
_Comparer = pComparer;
|
|
Sort();
|
|
}
|
|
|
|
public ObservableSortCollection(IEnumerable<T> pList, Comparison<T> 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 != 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<T> 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;
|
|
}
|
|
}
|
|
}
|
|
}
|