protected virtual void OnPropertyRollback(object sender, DictionaryObjectPropertyRollbackEventArgs e) => PropertyRollback?.Invoke(sender, e);
protected virtual bool DictionaryObjectSetPropertyValue(object value, DictionaryObjectPropertySetOptions options, [CallerMemberName] string name = null) { if (name == null) { throw new ArgumentNullException(nameof(name)); } IEnumerable oldErrors = null; bool rollbackOnError = (options & DictionaryObjectPropertySetOptions.RollbackChangeOnError) == DictionaryObjectPropertySetOptions.RollbackChangeOnError; bool onErrorsChanged = (options & DictionaryObjectPropertySetOptions.DontRaiseOnErrorsChanged) != DictionaryObjectPropertySetOptions.DontRaiseOnErrorsChanged; if (!DictionaryObjectRaiseOnErrorsChanged) { onErrorsChanged = false; } if (onErrorsChanged || rollbackOnError) { oldErrors = DictionaryObjectGetErrors(name); } bool forceChanged = (options & DictionaryObjectPropertySetOptions.ForceRaiseOnPropertyChanged) == DictionaryObjectPropertySetOptions.ForceRaiseOnPropertyChanged; bool onChanged = (options & DictionaryObjectPropertySetOptions.DontRaiseOnPropertyChanged) != DictionaryObjectPropertySetOptions.DontRaiseOnPropertyChanged; if (!DictionaryObjectRaiseOnPropertyChanged) { onChanged = false; forceChanged = false; } var newProp = DictionaryObjectCreateProperty(); newProp.Value = value; DictionaryObjectProperty oldProp = null; var finalProp = DictionaryObjectProperties.AddOrUpdate(name, newProp, (k, o) => { oldProp = o; var updating = DictionaryObjectUpdatingProperty(options, k, o, newProp); if (updating != null) { return(updating); } bool testEquality = (options & DictionaryObjectPropertySetOptions.DontTestValuesForEquality) != DictionaryObjectPropertySetOptions.DontTestValuesForEquality; if (testEquality && o != null && DictionaryObjectAreValuesEqual(value, o.Value)) { return(o); } bool onChanging = (options & DictionaryObjectPropertySetOptions.DontRaiseOnPropertyChanging) != DictionaryObjectPropertySetOptions.DontRaiseOnPropertyChanging; if (!DictionaryObjectRaiseOnPropertyChanging) { onChanging = false; } if (onChanging) { var e = new DictionaryObjectPropertyChangingEventArgs(name, oldProp, newProp); OnPropertyChanging(this, e); if (e.Cancel) { return(o); } } var updated = DictionaryObjectUpdatedProperty(options, k, o, newProp); if (updated != null) { return(updated); } return(newProp); }); if (forceChanged || (onChanged && ReferenceEquals(finalProp, newProp))) { bool rollbacked = false; if (rollbackOnError) { if ((DictionaryObjectGetErrors(name)?.Cast <object>().Any()).GetValueOrDefault()) { var rolled = DictionaryObjectRollbackProperty(options, name, oldProp, newProp); if (rolled == null) { rolled = oldProp; } if (rolled == null) { DictionaryObjectProperties.TryRemove(name, out DictionaryObjectProperty dop); } else { DictionaryObjectProperties.AddOrUpdate(name, rolled, (k, o) => rolled); } var e = new DictionaryObjectPropertyRollbackEventArgs(name, rolled, value); OnPropertyRollback(this, e); rollbacked = true; } } if (!rollbacked) { var e = new DictionaryObjectPropertyChangedEventArgs(name, oldProp, newProp); OnPropertyChanged(this, e); if (onErrorsChanged) { var newErrors = DictionaryObjectGetErrors(name); if (!DictionaryObjectAreErrorsEqual(oldErrors, newErrors)) { OnErrorsChanged(name); } } return(true); } } return(false); }