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()
- {
- }
- }
|