// if shouldRemove flag is true, newPropertyValue should be default void SetOrRemoveProperty(ObjectType obj, PropertyType newPropertyValue, bool shouldRemove = false) { APropertyValueWrapper <ObjectType, PropertyType> valueWrapper = GetValueWrapper(obj); PropertyType oldPropertyValue = GetCurrentValueFromWrapper(valueWrapper); if (oldPropertyValue.ObjEquals(newPropertyValue)) { // do not do or any event firing if the property did not change // this is important to prevent circlular updates // in case of the bindings. return; } // check the global BeforePropertyChanged Event if (BeforePropertyChangedFn != null) { // if returned false, do not proceed if (!BeforePropertyChangedFn(obj, oldPropertyValue, newPropertyValue)) { return; } } if (!shouldRemove) { if (valueWrapper == null) { valueWrapper = new APropertyValueWrapper <ObjectType, PropertyType> { Obj = obj }; _objectToPropValueMap.Add(obj, valueWrapper); } valueWrapper.APropertyValue = newPropertyValue; } else { _objectToPropValueMap.Remove(obj); } valueWrapper.FireOnPropertyChangedEvent(oldPropertyValue); if (shouldRemove) { valueWrapper.ClearOnPropertyChangedEvent(); } OnPropertyChangedFn?.Invoke(obj, oldPropertyValue, newPropertyValue); }
public override void OnPropertyChanged([CallerMemberName] string?propertyName = null) => _methodOnPropertyChangedDelegate?.Invoke(propertyName);