/// <summary>
        /// Initializes a new instance of the <see cref="ObservableDictionaryChangedEventArgs{TKey,TValue}"/> class.
        /// </summary>
        /// <param name="observableDictionaryChange">The observable dictionary change.</param>
        /// <exception cref="System.ArgumentNullException"></exception>
        public ObservableDictionaryChangedEventArgs(IObservableDictionaryChange <TKey, TValue> observableDictionaryChange)
        {
            if (observableDictionaryChange == null)
            {
                throw new ArgumentNullException(nameof(observableDictionaryChange));
            }

            Change = observableDictionaryChange;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Converts the given <paramref name="observableDictionaryChange"/> to its <see cref="IObservableCacheChange{TKey,TValue}"/> representation.
        /// </summary>
        /// <typeparam name="TKey">The type of the key.</typeparam>
        /// <typeparam name="TValue">The type of the value.</typeparam>
        /// <param name="observableDictionaryChange">The observable dictionary change.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException"></exception>
        /// <exception cref="System.InvalidOperationException">$The {nameof(ObservableDictionaryChangeType)}.{observableDictionaryChange.ChangeType} is not supported.</exception>
        internal static IObservableCacheChange <TKey, TValue> ToObservableCacheChange <TKey, TValue>(
            this IObservableDictionaryChange <TKey, ObservableCachedElement <TKey, TValue> > observableDictionaryChange)
        {
            if (observableDictionaryChange == null)
            {
                throw new ArgumentNullException(nameof(observableDictionaryChange));
            }

            // ToDo: revisit whether this is necessary and / or can be entirely done in the current using class(es)
            switch (observableDictionaryChange.ChangeType)
            {
            case ObservableDictionaryChangeType.Reset:
                return(ObservableCacheChange <TKey, TValue> .Reset());

            //case ObservableDictionaryChangeType.ItemAdded:
            //    return ObservableCacheChange<TKey, TValue>.ItemAdded(
            //        observableDictionaryChange.Key,
            //        observableDictionaryChange.Value.Value,
            //        observableDictionaryChange.Value.ExpiresAt(),
            //        observableDictionaryChange.Value.ExpirationType);
            // key changes are not supported
            //case ObservableDictionaryChangeType.ItemKeyChanged:
            // break;
            // value changes are not supported
            //case ObservableDictionaryChangeType.ItemValueChanged:
            // break;
            case ObservableDictionaryChangeType.ItemValueReplaced:
                return(ObservableCacheChange <TKey, TValue> .ItemReplaced(
                           observableDictionaryChange.Key,
                           observableDictionaryChange.Value.Value,
                           observableDictionaryChange.OldValue.Value,
                           observableDictionaryChange.Value.ExpiresAt(),
                           observableDictionaryChange.Value.ExpirationType));

            //case ObservableDictionaryChangeType.ItemRemoved:
            //    return ObservableCacheChange<TKey, TValue>.ItemRemoved(
            //        observableDictionaryChange.Key,
            //        observableDictionaryChange.Value.Value,
            //        observableDictionaryChange.Value.ExpiresAt(),
            //        observableDictionaryChange.Value.ExpirationType);
            default:
                throw new InvalidOperationException($"The {nameof(ObservableDictionaryChangeType)}.{observableDictionaryChange.ChangeType} is not supported.");
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Converts the given <paramref name="observableDictionaryChange" /> to its <see cref="IObservableCollectionChange{T}" /> counterpart.
        /// </summary>
        /// <typeparam name="TKey">The type of the key.</typeparam>
        /// <typeparam name="TValue">The type of the value.</typeparam>
        /// <param name="observableDictionaryChange">The observable dictionary change.</param>
        /// <param name="dictionary">The sender <see cref="IObservableDictionary{TKey,TValue}" />.</param>
        /// <param name="valueComparer">The <typeparamref name="TValue"/> equality comparer.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">observableDictionaryChange</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">$Only {ObservableDictionaryChangeType.ItemAdded}, {ObservableDictionaryChangeType.ItemValueChanged}, {ObservableDictionaryChangeType.ItemRemoved} and {ObservableDictionaryChangeType.Reset} are supported.</exception>
        public static IList <IObservableCollectionChange <KeyValuePair <TKey, TValue> > > ToObservableCollectionChanges <TKey, TValue>(
            this IObservableDictionaryChange <TKey, TValue> observableDictionaryChange,
            IObservableDictionary <TKey, TValue> dictionary,
            IEqualityComparer <TValue> valueComparer)
        {
            if (observableDictionaryChange == null)
            {
                throw new ArgumentNullException(nameof(observableDictionaryChange));
            }
            if (dictionary == null)
            {
                throw new ArgumentNullException(nameof(dictionary));
            }
            if (valueComparer == null)
            {
                throw new ArgumentNullException(nameof(valueComparer));
            }

            var result = new List <IObservableCollectionChange <KeyValuePair <TKey, TValue> > >();

            switch (observableDictionaryChange.ChangeType)
            {
            case ObservableDictionaryChangeType.ItemAdded:
                result.Add(new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                               ObservableCollectionChangeType.ItemAdded,
                               new KeyValuePair <TKey, TValue>(observableDictionaryChange.Key, observableDictionaryChange.Value)));
                break;

            case ObservableDictionaryChangeType.ItemKeyChanged:
            {
                TValue valueForKey;
                if (((IDictionary <TKey, TValue>)dictionary).TryGetValue(observableDictionaryChange.Key, out valueForKey))
                {
                    result.Add(new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                                   ObservableCollectionChangeType.ItemChanged,
                                   new KeyValuePair <TKey, TValue>(observableDictionaryChange.Key, valueForKey)));
                }
                break;
            }

            case ObservableDictionaryChangeType.ItemValueChanged:
            {
                result.AddRange(dictionary.GetKeysForValue(observableDictionaryChange.Value, valueComparer).Select(key =>
                                                                                                                   new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                                                                                                                       ObservableCollectionChangeType.ItemChanged,
                                                                                                                       new KeyValuePair <TKey, TValue>(key, observableDictionaryChange.Value))));
            }
            break;

            case ObservableDictionaryChangeType.ItemValueReplaced:
                result.Add(new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                               ObservableCollectionChangeType.ItemRemoved,
                               new KeyValuePair <TKey, TValue>(observableDictionaryChange.Key, observableDictionaryChange.OldValue)));
                result.Add(new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                               ObservableCollectionChangeType.ItemAdded,
                               new KeyValuePair <TKey, TValue>(observableDictionaryChange.Key, observableDictionaryChange.Value)));
                break;

            case ObservableDictionaryChangeType.ItemRemoved:
                result.Add(new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                               ObservableCollectionChangeType.ItemRemoved,
                               new KeyValuePair <TKey, TValue>(observableDictionaryChange.Key, observableDictionaryChange.OldValue)));
                break;

            case ObservableDictionaryChangeType.Reset:
                result.Add(new ObservableCollectionChange <KeyValuePair <TKey, TValue> >(
                               ObservableCollectionChangeType.Reset));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(observableDictionaryChange),
                                                      $"Only {ObservableDictionaryChangeType.ItemAdded}, {ObservableDictionaryChangeType.ItemValueChanged}, {ObservableDictionaryChangeType.ItemRemoved} and {ObservableDictionaryChangeType.Reset} are supported.");
            }

            return(result);
        }