// returns the AProperty value for the passed object. public PropertyType GetProperty(ObjectType obj) { APropertyValueWrapper <ObjectType, PropertyType> valueWrapper = GetValueWrapper(obj); return(GetCurrentValueFromWrapper(valueWrapper)); }
PropertyType GetCurrentValueFromWrapper(APropertyValueWrapper <ObjectType, PropertyType> valueWrapper) { if (valueWrapper == null) { return(_defaultValue); } return(valueWrapper.APropertyValue); }
// removes the individual change handler // from a passed object. public void RemoveOnPropertyChangedHandler ( ObjectType obj, OnPropertyChangedDelegate <ObjectType, PropertyType> propChangedHandler ) { APropertyValueWrapper <ObjectType, PropertyType> valueWrapper = GetValueWrapper(obj, true); valueWrapper.OnPropertyChangedEvent -= propChangedHandler; }
// 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); }
// clears AProperty from the passed object. public void ClearAProperty(ObjectType obj) { APropertyValueWrapper <ObjectType, PropertyType> valueWrapper = GetValueWrapper(obj); if (valueWrapper == null) { return; } SetOrRemoveProperty(obj, _defaultValue, true); //_objectToPropValueMap.Remove(obj); }
// adds an individual property change handler // on the passed object. (other object won't get affected) public void AddOnPropertyChangedHandler ( ObjectType obj, OnPropertyChangedDelegate <ObjectType, PropertyType> propChangedHandler ) { if (propChangedHandler == null) { return; } APropertyValueWrapper <ObjectType, PropertyType> valueWrapper = GetValueWrapper(obj, true); valueWrapper.OnPropertyChangedEvent += propChangedHandler; }
// given an object returns the ValueWrapper corresponding to the AProperty value // of this object. If it is null and createIfDoesNotExist flag set to true, // it will create the ValueWrapper with default value. APropertyValueWrapper <ObjectType, PropertyType> GetValueWrapper(ObjectType obj, bool createIfDoesNotExist = false) { APropertyValueWrapper <ObjectType, PropertyType> valueWrapper = null; if (!_objectToPropValueMap.TryGetValue(obj, out valueWrapper)) { if (createIfDoesNotExist) { if (valueWrapper == null) { valueWrapper = new APropertyValueWrapper <ObjectType, PropertyType> { Obj = obj, APropertyValue = _defaultValue }; _objectToPropValueMap.Add(obj, valueWrapper); } } } return(valueWrapper); }