| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Collections.Specialized; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace Bro.Common.Helper |
| | | { |
| | | public class NoticedList<T> : List<T> where T : class |
| | | { |
| | | public Action OnItemChanged; |
| | | public Action<NotifyCollectionChangedAction> OnItemChanged; |
| | | |
| | | public Action<List<T>> OnItemChangedWithItemInfo; |
| | | public Action<NotifyCollectionChangedAction, List<T>> OnItemChangedWithItemInfo; |
| | | |
| | | public Action<NoticedList<T>> OnItemChangedWithSelf; |
| | | //public Action<NotifyCollectionChangedAction, NoticedList<T>> OnItemChangedWithSelf; |
| | | |
| | | public new T this[int index] |
| | | { |
| | |
| | | if (base[index] != value) |
| | | { |
| | | base[index] = value; |
| | | OnItemChanged?.Invoke(); |
| | | OnItemChangedWithItemInfo?.Invoke(new List<T>() { value }); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | OnItemChanged?.Invoke(NotifyCollectionChangedAction.Replace); |
| | | OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Replace, new List<T>() { value }); |
| | | } |
| | | } |
| | | } |
| | |
| | | public new void Add(T item) |
| | | { |
| | | base.Add(item); |
| | | OnItemChanged?.Invoke(); |
| | | OnItemChangedWithItemInfo?.Invoke(new List<T>() { item }); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add); |
| | | OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, new List<T>() { item }); |
| | | } |
| | | |
| | | public new void AddRange(IEnumerable<T> collection) |
| | | { |
| | | base.AddRange(collection); |
| | | OnItemChanged?.Invoke(); |
| | | OnItemChangedWithItemInfo?.Invoke(collection.ToList()); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add); |
| | | OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, collection.ToList()); |
| | | } |
| | | |
| | | public new void Clear() |
| | | { |
| | | base.Clear(); |
| | | OnItemChanged?.Invoke(); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | OnItemChanged?.Invoke(NotifyCollectionChangedAction.Reset); |
| | | OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Reset, this); |
| | | } |
| | | |
| | | public new void Insert(int index, T item) |
| | | { |
| | | base.Insert(index, item); |
| | | OnItemChanged?.Invoke(); |
| | | OnItemChangedWithItemInfo?.Invoke(new List<T>() { item }); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | 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(); |
| | | OnItemChangedWithItemInfo?.Invoke(collection.ToList()); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | OnItemChanged?.Invoke(NotifyCollectionChangedAction.Add); |
| | | OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Add, collection.ToList()); |
| | | } |
| | | |
| | | public new bool Remove(T item) |
| | |
| | | |
| | | if (flag) |
| | | { |
| | | OnItemChanged?.Invoke(); |
| | | OnItemChangedWithItemInfo?.Invoke(new List<T>() { item }); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | 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(); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | 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(); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | 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(); |
| | | OnItemChangedWithSelf?.Invoke(this); |
| | | OnItemChanged?.Invoke(NotifyCollectionChangedAction.Remove); |
| | | OnItemChangedWithItemInfo?.Invoke(NotifyCollectionChangedAction.Remove, temp); |
| | | } |
| | | } |
| | | } |