public void Initialize(IEnumerable groupedItems, MvxExpandableDataConverter expandableDataConverter) { _observableItemsSource.Clear(); foreach (var disposables in _collectionChangedDisposables) { disposables.Dispose(); } _collectionChangedDisposables.Clear(); foreach (var mvxGroupable in groupedItems.Cast <object>().Select(expandableDataConverter.ConvertToMvxGroupedData)) { _observableItemsSource.Add(mvxGroupable); var collectionChangedGroup = mvxGroupable.GroupItems as INotifyCollectionChanged; if (collectionChangedGroup != null) { } } var observableGroups = groupedItems as INotifyCollectionChanged; if (observableGroups != null) { var observableGroupsDisposeSubscription = observableGroups.WeakSubscribe( (sender, args) => { switch (args.Action) { case NotifyCollectionChangedAction.Reset: _observableItemsSource.Clear(); break; case NotifyCollectionChangedAction.Add: foreach (var item in Enumerable.Cast <object>(args.NewItems)) { _observableItemsSource.Add(expandableDataConverter.ConvertToMvxGroupedData(item)); } break; case NotifyCollectionChangedAction.Remove: foreach (var item in Enumerable.Cast <object>(args.OldItems)) { var mvxGroupedData = expandableDataConverter.ConvertToMvxGroupedData(item); _observableItemsSource.Remove(mvxGroupedData); foreach (var childItem in mvxGroupedData.GroupItems) { _observableItemsSource.Remove(childItem); } } break; default: throw new InvalidOperationException("No move/replace in Grouped Items yet..."); } }); _collectionChangedDisposables.Add(observableGroupsDisposeSubscription); } }
void ObservableGroups_CollectionChanged(object sender, NotifyCollectionChangedEventArgs args) { switch (args.Action) { case NotifyCollectionChangedAction.Reset: var enumerableGroupedItems = sender as IEnumerable ?? Enumerable.Empty <object>(); _observableItemsSource.Clear(); foreach (var disposables in _groupedDataDisposables.Values) { disposables.Dispose(); } _groupedDataDisposables.Clear(); AddItems(enumerableGroupedItems, groupedDataConverter); break; case NotifyCollectionChangedAction.Add: var enumerableGroupedItems2 = sender as IEnumerable ?? Enumerable.Empty <object>(); _observableItemsSource.Clear(); foreach (var disposables in _groupedDataDisposables.Values) { disposables.Dispose(); } _groupedDataDisposables.Clear(); AddItems(enumerableGroupedItems2, groupedDataConverter); break; case NotifyCollectionChangedAction.Remove: foreach (var item in Enumerable.Cast <object>(args.OldItems)) { var mvxGroupedData = groupedDataConverter.ConvertToMvxGroupedData(item); _observableItemsSource.Remove(mvxGroupedData); if (_groupedDataDisposables.ContainsKey(mvxGroupedData)) { _groupedDataDisposables[mvxGroupedData].Dispose(); _groupedDataDisposables.Remove(mvxGroupedData); } } break; default: ItemsMovedOrReplaced?.Invoke(); break; } }