119 lines
3.9 KiB
C#
119 lines
3.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.Linq;
|
|
|
|
namespace BRS.Common.Model.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);
|
|
}
|
|
}
|
|
}
|