/// <inheritdoc /> public virtual void Rollback() { lock (_sync) { _deletedEntities.Clear(); foreach (var entity in _entityCache) { lock (entity.Value.SynchronizationContext) { if (!entity.Value.IsChanged) { continue; } var valuesToSet = new List <MulticastPropertyValue>(); foreach (var currentPropertyValue in entity.Value.PropertyValues) { MulticastPropertyValue valueToSet = null; var originalValue = entity.Value.OriginalValues.FindMatching(currentPropertyValue); if (originalValue != null) { entity.Value.OriginalValues.Remove(originalValue); if (originalValue.Value != null) { valueToSet = originalValue; } } if (valueToSet == null) { valueToSet = new MulticastPropertyValue(currentPropertyValue.CastedType, currentPropertyValue.Property, null); } valuesToSet.Add(valueToSet); } foreach (var propertyValue in valuesToSet.Concat(entity.Value.OriginalValues)) { entity.Value.SetPropertyInternal(propertyValue.Property, propertyValue.Value); } entity.Value.IsInitialized = true; } } } }
private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e, MulticastPropertyValue propertyValue) { var originalValue = (IList)typeof(ObservableList <>).MakeGenericType(propertyValue.Value.GetType().GetGenericArguments()[0]) .GetConstructor(Type.EmptyTypes).Invoke(null); if (e.Action == NotifyCollectionChangedAction.Remove) { foreach (var removed in e.OldItems) { originalValue.Add(removed); } } foreach (var item in (IEnumerable)propertyValue.Value) { if (((e.Action == NotifyCollectionChangedAction.Remove) && (e.OldItems.Contains(item))) || (e.Action == NotifyCollectionChangedAction.Add)) { continue; } originalValue.Add(item); } OriginalValues.Remove(propertyValue); OriginalValues.Add(new MulticastPropertyValue(propertyValue.CastedType, propertyValue.Property, originalValue)); ((IObservableCollection)sender).ClearCollectionChanged(); }
internal static MulticastPropertyValue FindMatching(this IEnumerable <MulticastPropertyValue> propertyValues, MulticastPropertyValue actualPropertyValue) { return(propertyValues.FirstOrDefault(propertyValue => (propertyValue.Property == actualPropertyValue.Property) && (propertyValue.CastedType == actualPropertyValue.CastedType))); }