| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | using System;using System.Collections.Generic;using System.ComponentModel;namespace InABox.Core{    public class ObservableList<T> : List<T>, IBaseObject where T : BaseObject, new()    {        private bool _observing = true;        private bool bApplyingChanges;        private bool bChanged;        private readonly List<T> OriginalItems = new List<T>();        public bool IsObserving()        {            return _observing;        }        public void SetObserving(bool active)        {            _observing = active;        }        public bool IsChanged()        {            return QueryChanged();        }        public void CancelChanges()        {            Clear();            AddRange(OriginalItems);            bChanged = false;        }        public void CommitChanges()        {            OriginalItems.Clear();            OriginalItems.AddRange(this);            bChanged = false;        }        private bool QueryChanged()        {            if (bChanged)                return true;            foreach (var item in this)                if (item.IsChanged())                    return true;            return false;        }        private void Changed()        {            bChanged = true;            if (!bApplyingChanges)            {                bApplyingChanges = true;                OnChanged?.Invoke(this, new EventArgs());                bApplyingChanges = false;            }        }        public new void Add(T item)        {            base.Add(item);            item.PropertyChanged += Item_PropertyChanged;            Changed();        }        private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)        {            Changed();        }        public new void AddRange(IEnumerable<T> collection)        {            base.AddRange(collection);            foreach (var item in collection)                item.PropertyChanged += Item_PropertyChanged;            Changed();        }        public new void Clear()        {            foreach (var item in this)                item.PropertyChanged -= Item_PropertyChanged;            base.Clear();            Changed();        }        public new void Remove(T item)        {            base.Remove(item);            item.PropertyChanged -= Item_PropertyChanged;            Changed();        }        public event EventHandler OnChanged;    }    public class EntityList<T> : ObservableList<T> where T : Entity, new()    {    }}
 |