EntityList.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. namespace InABox.Core
  5. {
  6. public class ObservableList<T> : List<T>, IBaseObject where T : BaseObject, new()
  7. {
  8. private bool _observing = true;
  9. private bool bApplyingChanges;
  10. private bool bChanged;
  11. private readonly List<T> OriginalItems = new List<T>();
  12. public bool IsObserving()
  13. {
  14. return _observing;
  15. }
  16. public void SetObserving(bool active)
  17. {
  18. _observing = active;
  19. }
  20. public bool IsChanged()
  21. {
  22. return QueryChanged();
  23. }
  24. public void CancelChanges()
  25. {
  26. Clear();
  27. AddRange(OriginalItems);
  28. bChanged = false;
  29. }
  30. public void CommitChanges()
  31. {
  32. OriginalItems.Clear();
  33. OriginalItems.AddRange(this);
  34. bChanged = false;
  35. }
  36. private bool QueryChanged()
  37. {
  38. if (bChanged)
  39. return true;
  40. foreach (var item in this)
  41. if (item.IsChanged())
  42. return true;
  43. return false;
  44. }
  45. private void Changed()
  46. {
  47. bChanged = true;
  48. if (!bApplyingChanges)
  49. {
  50. bApplyingChanges = true;
  51. OnChanged?.Invoke(this, new EventArgs());
  52. bApplyingChanges = false;
  53. }
  54. }
  55. public new void Add(T item)
  56. {
  57. base.Add(item);
  58. item.PropertyChanged += Item_PropertyChanged;
  59. Changed();
  60. }
  61. private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
  62. {
  63. Changed();
  64. }
  65. public new void AddRange(IEnumerable<T> collection)
  66. {
  67. base.AddRange(collection);
  68. foreach (var item in collection)
  69. item.PropertyChanged += Item_PropertyChanged;
  70. Changed();
  71. }
  72. public new void Clear()
  73. {
  74. foreach (var item in this)
  75. item.PropertyChanged -= Item_PropertyChanged;
  76. base.Clear();
  77. Changed();
  78. }
  79. public new void Remove(T item)
  80. {
  81. base.Remove(item);
  82. item.PropertyChanged -= Item_PropertyChanged;
  83. Changed();
  84. }
  85. public event EventHandler OnChanged;
  86. }
  87. public class EntityList<T> : ObservableList<T> where T : Entity, new()
  88. {
  89. }
  90. }