示例#1
0
        // 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);