From 08bb4635607a198f21991cc593eac1ddf8d0a21e Mon Sep 17 00:00:00 2001 From: Mbucari Date: Wed, 11 Jan 2023 14:38:12 -0700 Subject: [PATCH] Invoke observables directly instead of through event handler --- .../PropertyChangeFilter.cs | 53 ++++++++----------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/Source/LibationFileManager/PropertyChangeFilter.cs b/Source/LibationFileManager/PropertyChangeFilter.cs index c30bfa0f..5fe0d6e4 100644 --- a/Source/LibationFileManager/PropertyChangeFilter.cs +++ b/Source/LibationFileManager/PropertyChangeFilter.cs @@ -79,23 +79,36 @@ namespace LibationFileManager { private readonly Dictionary> propertyChangedActions = new(); private readonly Dictionary> propertyChangingActions = new(); - + private readonly List<(PropertyChangedEventHandlerEx subscriber, PropertyChangedEventHandlerEx wrapper)> changedFilters = new(); private readonly List<(PropertyChangingEventHandlerEx subscriber, PropertyChangingEventHandlerEx wrapper)> changingFilters = new(); - public PropertyChangeFilter() + protected void OnPropertyChanged(string propertyName, object newValue) { - PropertyChanging += Configuration_PropertyChanging; - PropertyChanged += Configuration_PropertyChanged; + if (propertyChangedActions.ContainsKey(propertyName)) + { + //Invoke observables registered for propertyName + foreach (var action in propertyChangedActions[propertyName]) + action.DynamicInvoke(newValue); + } + + _propertyChanged?.Invoke(this, new(propertyName, newValue)); + } + + protected void OnPropertyChanging(string propertyName, object oldValue, object newValue) + { + if (propertyChangingActions.ContainsKey(propertyName)) + { + //Invoke observables registered for propertyName + foreach (var action in propertyChangingActions[propertyName]) + action.DynamicInvoke(oldValue, newValue); + } + + _propertyChanging?.Invoke(this, new(propertyName, oldValue, newValue)); } #region Events - protected void OnPropertyChanged(string propertyName, object newValue) - => _propertyChanged?.Invoke(this, new(propertyName, newValue)); - protected void OnPropertyChanging(string propertyName, object oldValue, object newValue) - => _propertyChanging?.Invoke(this, new(propertyName, oldValue, newValue)); - private PropertyChangedEventHandlerEx _propertyChanged; private PropertyChangingEventHandlerEx _propertyChanging; @@ -255,28 +268,6 @@ namespace LibationFileManager throw new InvalidCastException($"{nameof(Configuration)}.{propertyName} is {propertyInfo.PropertyType}, but parameter is {typeof(T)}."); } - private void Configuration_PropertyChanged(object sender, PropertyChangedEventArgsEx e) - { - if (propertyChangedActions.ContainsKey(e.PropertyName)) - { - foreach (var action in propertyChangedActions[e.PropertyName]) - { - action.DynamicInvoke(e.NewValue); - } - } - } - - private void Configuration_PropertyChanging(object sender, PropertyChangingEventArgsEx e) - { - if (propertyChangingActions.ContainsKey(e.PropertyName)) - { - foreach (var action in propertyChangingActions[e.PropertyName]) - { - action.DynamicInvoke(e.OldValue, e.NewValue); - } - } - } - private class Unsubscriber : IDisposable { private List _observers;