Просмотр исходного кода

Fixed problems with cascading changes in BaseObject; renamed PropertyChanged to PropertyEdited

Kenric Nugteren 1 неделя назад
Родитель
Сommit
d93690cabb

+ 1 - 1
InABox.Avalonia.Platform/Geolocation/DefaultGeolocation.cs

@@ -109,7 +109,7 @@ public class DefaultGeolocation : INotifyPropertyChanged, IGeolocation
     
     #region INotifyPropertyChanged
     
-    public event PropertyChangedEventHandler? PropertyChanged;
+    public event PropertyChangedEventHandler? PropertyEdited;
 
     protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
     {

+ 1 - 1
InABox.Avalonia/DataModels/QueuedUpdater/QueueUpdater.cs

@@ -39,7 +39,7 @@ public class QueueUpdater<TEntity> : IDisposable, IQueueUpdater<TEntity>
         Save(_state);
         _cache[entity] = _state;
             
-        entity.PropertyChanged += (sender, args) =>
+        entity.PropertyEdited += (sender, args) =>
         {
             var state = _cache[entity];
             state.Changes[args.PropertyName] = CoreUtils.GetPropertyValue(entity,args.PropertyName);

+ 2 - 2
InABox.Avalonia/DataModels/Shell.cs

@@ -56,8 +56,8 @@ public abstract class Shell<TParent,TEntity> : INotifyPropertyChanged, IShell, I
     private TEntity CheckEntity()
     {
         _entity ??= Row.ToObject<TEntity>();
-        _entity.PropertyCascaded -= _entity_PropertyChanged;
-        _entity.PropertyCascaded += _entity_PropertyChanged;
+        _entity.PropertyChanged -= _entity_PropertyChanged;
+        _entity.PropertyChanged += _entity_PropertyChanged;
         return _entity;
     }
 

+ 43 - 16
InABox.Core/Objects/BaseObject.cs

@@ -234,20 +234,24 @@ namespace InABox.Core
 
         public static bool GlobalObserving = true;
 
-        private bool _observing = false;
+        internal bool _observing = false;
+        internal bool _observingOnlyCascades = false;
 
         public bool IsObserving()
         {
             return GlobalObserving && _observing;
         }
 
-        public void SetObserving(bool active)
+        void IBaseObject.SetObserving(bool active) => SetObserving(active);
+
+        public void SetObserving(bool active, bool? onlyCascades = null)
         {
             bApplyingChanges = true;
             _observing = active;
+            _observingOnlyCascades = onlyCascades ?? _observingOnlyCascades;
             _disabledInterceptor = true;
             foreach (var oo in DatabaseSchema.GetSubObjects(this))
-                oo.SetObserving(active);
+                oo.SetObserving(active, onlyCascades: onlyCascades);
             _disabledInterceptor = false;
             bApplyingChanges = false;
         }
@@ -256,21 +260,25 @@ namespace InABox.Core
         {
         }
 
+        protected virtual void DoPropertyCascaded(string name, object? before, object? after)
+        {
+        }
+
         /// <summary>
         /// Triggered for any property change, but is not triggered if that property change triggers any other property changes.
         /// </summary>
         /// <remarks>
-        ///     See also <seealso cref="PropertyCascaded"/>.
+        ///     See also <seealso cref="PropertyChanged"/>.
         /// </remarks>
-        public event PropertyChangedEventHandler? PropertyChanged;
+        public event PropertyChangedEventHandler? PropertyEdited;
 
         /// <summary>
         /// Triggered for any property change, including property changes triggered by other properties changing.
         /// </summary>
         /// <remarks>
-        /// Most cases should just use <see cref="PropertyChanged"/>.
+        /// Should be used for data binding and stuff.
         /// </remarks>
-        public event PropertyChangedEventHandler? PropertyCascaded;
+        public event PropertyChangedEventHandler? PropertyChanged;
         
         private bool bApplyingChanges;
 
@@ -329,7 +337,7 @@ namespace InABox.Core
 
                     DoPropertyChanged(name, before, after);
 
-                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+                    PropertyEdited?.Invoke(this, new PropertyChangedEventArgs(name));
                 }
                 catch (Exception e)
                 {
@@ -340,7 +348,8 @@ namespace InABox.Core
 
             try
             {
-                PropertyCascaded?.Invoke(this, new PropertyChangedEventArgs(name));
+                DoPropertyCascaded(name, before, after);
+                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
             }
             catch (Exception e)
             {
@@ -374,7 +383,21 @@ namespace InABox.Core
         public void OnPropertyChanged(string name, object? before, object? after)
         {
             if (!IsObserving())
+            {
+                if (_observingOnlyCascades)
+                {
+                    try
+                    {
+                        DoPropertyCascaded(name, before, after);
+                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+                    }
+                    catch (Exception e)
+                    {
+                        CoreUtils.LogException("", e);
+                    }
+                }
                 return;
+            }
 
             if (name.Equals("IsChanged") || name.Equals("Observing") || name.Equals("OriginalValues"))
                 return;
@@ -406,8 +429,10 @@ namespace InABox.Core
         public void CancelChanges()
         {
             bApplyingChanges = true;
-            var bObs = IsObserving();
-            SetObserving(false);
+
+            var bObs = _observing;
+            var onlyCascades = _observingOnlyCascades;
+            SetObserving(false, onlyCascades: true);
 
             foreach (var (key, value) in OriginalValueList)
             {
@@ -417,6 +442,8 @@ namespace InABox.Core
                     if(prop != null)
                     {
                         prop.Setter()(this, value);
+
+                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(key));
                     }
                     else
                     {
@@ -431,7 +458,6 @@ namespace InABox.Core
 
             OriginalValueList.Clear();
 
-
             bChanged = false;
 
             _disabledInterceptor = true;
@@ -441,7 +467,7 @@ namespace InABox.Core
             }
             _disabledInterceptor = false;
 
-            SetObserving(bObs);
+            SetObserving(bObs, onlyCascades: onlyCascades);
             bApplyingChanges = false;
         }
 
@@ -570,8 +596,9 @@ namespace InABox.Core
         {
             Object.CancelChanges();
 
-            var bObs = Object.IsObserving();
-            Object.SetObserving(false);
+            var bObs = Object._observing;
+            var onlyCascades = Object._observingOnlyCascades;
+            Object.SetObserving(false, true);
             foreach(var (prop, value) in Values)
             {
                 var oldValue = prop.Getter()(Object);
@@ -582,7 +609,7 @@ namespace InABox.Core
                     Object.OriginalValueList[prop.Name] = oldValue;
                 }
             }
-            Object.SetObserving(bObs);
+            Object.SetObserving(bObs, onlyCascades: onlyCascades);
         }
     }
 

+ 2 - 2
InABox.Core/Objects/EnclosedEntity.cs

@@ -38,8 +38,8 @@ namespace InABox.Core
         public BaseObject? GetLinkedParent() => _linkedParent;
 
         public string? GetLinkedPath() => _linkedPath;
-        
-        protected override void DoPropertyChanged(string name, object? before, object? after)
+
+        protected override void DoPropertyCascaded(string name, object? before, object? after)
         {
             LinkedProperties.GetParent(this)?.CascadePropertyChanged(LinkedProperties.GetPath(this) + "." + name, before, after);
 

+ 1 - 1
InABox.Core/Objects/EntityLink.cs

@@ -118,7 +118,7 @@ namespace InABox.Core
             return result;
         }
 
-        protected override void DoPropertyChanged(string name, object? before, object? after)
+        protected override void DoPropertyCascaded(string name, object? before, object? after)
         {
             LinkedProperties.GetParent(this)?.CascadePropertyChanged(LinkedProperties.GetPath(this) + "." + name, before, after);
 

+ 4 - 4
InABox.Core/Objects/EntityList.cs

@@ -70,7 +70,7 @@ namespace InABox.Core
         public new void Add(T item)
         {
             base.Add(item);
-            item.PropertyChanged += Item_PropertyChanged;
+            item.PropertyEdited += Item_PropertyChanged;
             Changed();
         }
 
@@ -83,14 +83,14 @@ namespace InABox.Core
         {
             base.AddRange(collection);
             foreach (var item in collection)
-                item.PropertyChanged += Item_PropertyChanged;
+                item.PropertyEdited += Item_PropertyChanged;
             Changed();
         }
 
         public new void Clear()
         {
             foreach (var item in this)
-                item.PropertyChanged -= Item_PropertyChanged;
+                item.PropertyEdited -= Item_PropertyChanged;
             base.Clear();
             Changed();
         }
@@ -98,7 +98,7 @@ namespace InABox.Core
         public new void Remove(T item)
         {
             base.Remove(item);
-            item.PropertyChanged -= Item_PropertyChanged;
+            item.PropertyEdited -= Item_PropertyChanged;
             Changed();
         }
 

+ 1 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileToolGrid/AsyncCommand.cs

@@ -29,7 +29,7 @@ namespace InABox.Mobile
             _canExecute = canExecute ?? (_ => true);
             if (notificationSource != null) 
             {
-                notificationSource.PropertyChanged += (s, e) => RaiseCanExecuteChanged();   
+                notificationSource.PropertyEdited += (s, e) => RaiseCanExecuteChanged();   
             }
         }
 

+ 3 - 3
InABox.Mobile/InABox.Mobile.Shared/DataModels/CoreRepository.cs

@@ -129,11 +129,11 @@ namespace InABox.Mobile
 
         #region INotifyPropertyChanged
         
-        public event PropertyChangedEventHandler PropertyChanged;
+        public event PropertyChangedEventHandler PropertyEdited;
 
         protected void DoPropertyChanged(object sender, PropertyChangedEventArgs args)
         {
-            PropertyChanged?.Invoke(sender, args);
+            PropertyEdited?.Invoke(sender, args);
         }
         
         protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
@@ -609,7 +609,7 @@ namespace InABox.Mobile
             where T : Shell<TParent,TEntity>, new()
         {
             var result = new T() { Row = row, Parent = (TParent)this };
-            result.PropertyChanged += (_, args) => DoPropertyChanged(result, args);
+            result.PropertyEdited += (_, args) => DoPropertyChanged(result, args);
             return result;
         }
 

+ 1 - 1
InABox.Mobile/InABox.Mobile.Shared/DataModels/QueuedUpdater/IQueuedUpdater.cs

@@ -60,7 +60,7 @@ namespace InABox.Mobile
             Save(_state);
             _cache[entity] = _state;
             
-            entity.PropertyChanged += (sender, args) =>
+            entity.PropertyEdited += (sender, args) =>
             {
                 var state = _cache[entity];
                 state.Changes[args.PropertyName] = CoreUtils.GetPropertyValue(entity,args.PropertyName);

+ 2 - 2
InABox.Mobile/InABox.Mobile.Shared/DataModels/Shell.cs

@@ -15,11 +15,11 @@ namespace InABox.Mobile
         
         #region INotifyPropertyChanged
         
-        public new event PropertyChangedEventHandler PropertyChanged;
+        public new event PropertyChangedEventHandler PropertyEdited;
         
         protected void DoPropertyChanged(string propertyName)
         {
-            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+            PropertyEdited?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
         
         protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = null)