/// <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; }
/// <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; } } } }