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); } }
private void AddItems(IEnumerable groupedItems, MvxExpandableDataConverter groupedDataConverter) { foreach (var mvxGroupable in groupedItems.Cast <object>().Select(groupedDataConverter.ConvertToMvxGroupedData)) { if (!_observableItemsSource.Contains(mvxGroupable)) { _observableItemsSource.Add(mvxGroupable); } var childNotifyCollectionChanged = mvxGroupable.GroupItems as INotifyCollectionChanged; if (childNotifyCollectionChanged == null) { continue; } if (!_groupedDataDisposables.ContainsKey(mvxGroupable)) { EventHandler <NotifyCollectionChangedEventArgs> collectionChangedHandler = (sender, args) => { switch (args.Action) { case NotifyCollectionChangedAction.Add: AddChildItems(mvxGroupable, args.NewItems); break; case NotifyCollectionChangedAction.Remove: RemoveChildItems(mvxGroupable, args.OldItems); break; case NotifyCollectionChangedAction.Reset: ResetChildCollection(mvxGroupable); break; default: ItemsMovedOrReplaced?.Invoke(); break; } }; _groupedDataDisposables.Add(mvxGroupable, new EventHandlerWeakSubscriptionHolder( collectionChangedHandler, childNotifyCollectionChanged.WeakSubscribe(collectionChangedHandler) ) ); } } }
public void Initialize(IEnumerable groupedItems, MvxExpandableDataConverter groupedDataConverter) { DisposeOldSource(); this.groupedDataConverter = groupedDataConverter; var observableGroups = groupedItems as INotifyCollectionChanged; oldGroupedDataSource = observableGroups; if (observableGroups != null) { observableGroups.CollectionChanged += ObservableGroups_CollectionChanged; } AddItems(groupedItems, groupedDataConverter); }