Files
Chat/ChatController/Utilities/Extensions/ObservableSortCollection.cs
LynJet 410945af20 Massennachricht hinzugefügt
Optik an die vom Android- und Webclient angepasst
Asynchrone Methoden verbessert
2022-07-11 16:01:14 +02:00

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;
}
}
}
}