Exemple #1
0
        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;
            }
        }