Esempio n. 1
0
        /// <summary>
        /// Converts the given <paramref name="observableListChange" /> to its <see cref="ListChangedEventArgs" /> counter part.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="observableListChange">The <see cref="IObservableListChange{T}" /> instance containing the event data.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException"></exception>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        public static ListChangedEventArgs ToListChangedEventArgs <T>(this IObservableListChange <T> observableListChange)
        {
            if (observableListChange == null)
            {
                throw new ArgumentNullException(nameof(observableListChange));
            }

            switch (observableListChange.ChangeType)
            {
            case ObservableListChangeType.ItemAdded:
                return(new ListChangedEventArgs(ListChangedType.ItemAdded, observableListChange.Index));

            case ObservableListChangeType.ItemChanged:
                return(new ListChangedEventArgs(ListChangedType.ItemChanged, observableListChange.Index, observableListChange.OldIndex));

            case ObservableListChangeType.ItemMoved:
                return(new ListChangedEventArgs(ListChangedType.ItemMoved, observableListChange.Index, observableListChange.OldIndex));

            case ObservableListChangeType.ItemRemoved:
                return(new ListChangedEventArgs(ListChangedType.ItemDeleted, observableListChange.Index, observableListChange.OldIndex));

            case ObservableListChangeType.Reset:
                return(new ListChangedEventArgs(ListChangedType.Reset, observableListChange.Index));

            default:
                throw new ArgumentOutOfRangeException(nameof(observableListChange),
                                                      $"Only {ObservableListChangeType.ItemAdded}, {ObservableListChangeType.ItemChanged}, {ObservableListChangeType.ItemMoved}, {ObservableListChangeType.ItemRemoved} and {ObservableListChangeType.Reset} are supported.");
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ObservableListChangedEventArgs{T}"/> class.
        /// </summary>
        /// <param name="observableListChange">The observable list change.</param>
        /// <exception cref="System.ArgumentNullException"></exception>
        public ObservableListChangedEventArgs(IObservableListChange <T> observableListChange)
        {
            if (observableListChange == null)
            {
                throw new ArgumentNullException(nameof(observableListChange));
            }

            Change = observableListChange;
        }
Esempio n. 3
0
        /// <summary>
        /// Converts the given <paramref name="observableListChange" /> to its <see cref="NotifyCollectionChangedEventArgs" /> counter part.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="observableListChange">The <see cref="IObservableListChange{T}" /> instance containing the event data.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException"></exception>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        public static NotifyCollectionChangedEventArgs ToNotifyCollectionChangedEventArgs <T>(this IObservableListChange <T> observableListChange)
        {
            if (observableListChange == null)
            {
                throw new ArgumentNullException(nameof(observableListChange));
            }

            switch (observableListChange.ChangeType)
            {
            case ObservableListChangeType.ItemAdded:
                return(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, observableListChange.Item, observableListChange.Index));

            case ObservableListChangeType.ItemChanged:
                return(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, observableListChange.Item, observableListChange.Index));

            case ObservableListChangeType.ItemMoved:
                return(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, observableListChange.Item, observableListChange.Index, observableListChange.OldIndex));

            case ObservableListChangeType.ItemRemoved:
                return(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, observableListChange.Item, observableListChange.Index, observableListChange.OldIndex));

            case ObservableListChangeType.Reset:
                return(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));

            default:
                throw new ArgumentOutOfRangeException(nameof(observableListChange),
                                                      $"Only {ObservableListChangeType.ItemAdded}, {ObservableListChangeType.ItemChanged}, {ObservableListChangeType.ItemMoved}, {ObservableListChangeType.ItemRemoved} and {ObservableListChangeType.Reset} are supported.");
            }
        }
        /// <summary>
        ///     Notifies all <see cref="ListChanges" /> and <see cref="INotifyObservableResets.Resets" /> subscribers and
        ///     raises the (observable)collection changed events.
        /// </summary>
        /// <param name="observableListChange">The observable list change.</param>
        protected virtual void NotifySubscribersAboutListChanges(IObservableListChange <T> observableListChange)
        {
            // This is similar to what ObservableCollection implements via its NotifyObserversAboutCollectionChanges method,
            // however:
            // - no need to handle count-relevant changes because the underlying ObservableCollection takes care of this
            // - no (extra) (Raise)CollectionChanged call here, again.. already done by the ObservableCollection
            // - however as 'Move's are only possible for / with ObservableLists, we also raise a PropertyChangedEvent for 'Item[]' (for wpf) in case of a item move(s)

            if (observableListChange == null)
            {
                throw new ArgumentNullException(nameof(observableListChange));
            }

            CheckForAndThrowIfDisposed();

            // go ahead and check whether a Reset or item add, -change, -move or -remove shall be signaled
            // .. based on the ThresholdAmountWhenChangesAreNotifiedAsReset value
            var actualObservableListChange =
                (observableListChange.ChangeType == ObservableListChangeType.Reset ||
                 IsItemsChangedAmountGreaterThanResetThreshold(1, ThresholdAmountWhenChangesAreNotifiedAsReset))
                    ? ObservableListChange <T> .Reset(this)
                    : observableListChange;

            // raise events and notify about list changes
            try
            {
                ListChangesObserver.OnNext(actualObservableListChange);
            }
            catch (Exception exception)
            {
                var observerException = new ObserverException(
                    $"An error occured notifying {nameof(ListChanges)} observers of this {this.GetType().Name}.",
                    exception);

                ObserverExceptionsObserver.OnNext(observerException);

                if (observerException.Handled == false)
                {
                    throw;
                }
            }

            if (actualObservableListChange.ChangeType == ObservableListChangeType.ItemMoved)
            {
                try
                {
                    RaisePropertyChanged(ItemIndexerName);
                }
                catch (Exception exception)
                {
                    var observerException = new ObserverException(
                        $"An error occured notifying {nameof(PropertyChanged)} subscribers of this {this.GetType().Name}.",
                        exception);

                    ObserverExceptionsObserver.OnNext(observerException);

                    if (observerException.Handled == false)
                    {
                        throw;
                    }
                }
            }
        }