예제 #1
0
        /// <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;
                    }
                }
            }
        }
예제 #2
0
        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)));
 }