public override void RemoveAt(int index)
        {
            var e = new EventListIndexedArgs <T>()
            {
                Item  = this[index],
                Index = index
            };

            base.RemoveAt(index);
            OnRemoved(e);
            OnChanged();
        }
        public override void Insert(int index, T item)
        {
            base.Insert(index, item);
            var e = new EventListIndexedArgs <T>()
            {
                Item  = item,
                Index = index
            };

            OnAdded(e);
            OnChanged();
        }
        public override void Add(T item)
        {
            base.Add(item);
            var e = new EventListIndexedArgs <T>()
            {
                Item  = item,
                Index = base.Count - 1
            };

            OnAdded(e);
            OnChanged();
        }
 public override void Clear()
 {
     for (var i = 0; i < Count; i++)
     {
         var e = new EventListIndexedArgs <T>()
         {
             Item  = this[i],
             Index = i
         };
         OnRemoved(e);
     }
     OnChanged();
     base.Clear();
 }
 public override T this[int index]
 {
     get => base[index];
     set
     {
         var old = base[index];
         var pre = new EventListIndexedArgs <T>()
         {
             Item  = old,
             Index = index
         };
         var post = new EventListIndexedArgs <T>()
         {
             Item  = value,
             Index = index
         };
         base[index] = value;
         OnRemoved(pre);
         OnAdded(post);
         OnChanged();
     }
 }
 protected virtual void OnRemoved(EventListIndexedArgs <T> e)
 {
     Removed?.Invoke(this, e);
 }