using System;
|
using System.Collections.Generic;
|
using System.Collections.Specialized;
|
using System.Linq;
|
|
namespace Bro.Common.Helper
|
{
|
public class NoticedList<T> : List<T> where T : class
|
{
|
public Action<NotifyCollectionChangedAction> OnItemChanged;
|
|
public Action<NotifyCollectionChangedAction, List<T>> OnItemChangedWithItemInfo;
|
|
//public Action<NotifyCollectionChangedAction, NoticedList<T>> OnItemChangedWithSelf;
|
|
public new T this[int index]
|
{
|
get
|
{
|
if (index >= 0 && index < Count)
|
{
|
return base[index];
|
}
|
else
|
{
|
return null;
|
}
|
|
}
|
set
|
{
|
if (base[index] != value)
|
{
|
base[index] = value;
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Replace);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Replace, new List<T>() { value });
|
}
|
}
|
}
|
|
public new void Add(T item)
|
{
|
base.Add(item);
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, new List<T>() { item });
|
}
|
|
public new void AddRange(IEnumerable<T> collection)
|
{
|
base.AddRange(collection);
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, collection.ToList());
|
}
|
|
public new void Clear()
|
{
|
base.Clear();
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Reset);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Reset, this);
|
}
|
|
public new void Insert(int index, T item)
|
{
|
base.Insert(index, item);
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, new List<T>() { item });
|
}
|
|
public new void InsertRange(int index, IEnumerable<T> collection)
|
{
|
base.InsertRange(index, collection);
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, collection.ToList());
|
}
|
|
public new bool Remove(T item)
|
{
|
bool flag = base.Remove(item);
|
|
if (flag)
|
{
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Remove);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Remove, new List<T>() { item });
|
}
|
|
return flag;
|
}
|
|
public new int RemoveAll(Predicate<T> match)
|
{
|
List<T> temp = this.Where(u => match.Invoke(u)).ToList();
|
int i = base.RemoveAll(match);
|
if (i > 0)
|
{
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Remove);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Remove, temp);
|
}
|
|
return i;
|
}
|
|
public new void RemoveAt(int index)
|
{
|
var item = this[index];
|
base.RemoveAt(index);
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Remove);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Remove, new List<T>() { item });
|
}
|
|
public new void RemoveRange(int index, int count)
|
{
|
List<T> temp = this.Skip(index).Take(count).ToList();
|
base.RemoveRange(index, count);
|
OnItemChanged?.Invoke(NotifyCollectionChangedAction.Remove);
|
OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Remove, temp);
|
}
|
}
|
}
|