using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; namespace Bro.Common.Helper { public class NoticedList : List where T : class { public Action OnItemChanged; public Action> OnItemChangedWithItemInfo; //public Action> 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() { value }); } } } public new void Add(T item) { base.Add(item); OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add); OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, new List() { item }); } public new void AddRange(IEnumerable 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() { item }); } public new void InsertRange(int index, IEnumerable 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() { item }); } return flag; } public new int RemoveAll(Predicate match) { List 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() { item }); } public new void RemoveRange(int index, int count) { List temp = this.Skip(index).Take(count).ToList(); base.RemoveRange(index, count); OnItemChanged?.Invoke(NotifyCollectionChangedAction.Remove); OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Remove, temp); } } }