Files
ShaftControlCodes/src/BRS.Common.Model/Helper/ListHelper.cs
2023-02-23 14:52:43 +08:00

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