Создайте пользовательский объект ICollectionView для UWP XAML, который реализует группировку - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно что-то вроде этого: AdvancedCollectionViewControl из набора инструментов сообщества UWP, и я могу заставить все это работать для пользовательского ICollectionView, за исключением того, что в них не реализована группировка.

I Мне нужен ICollectionView, который выполняет фильтрацию, сортировку и группировку, чтобы я мог связать его с UWP ListView, который выполняет группировку и имеет элемент управления SemanticZoom. Этого не существует в UWP

Как я могу взять пример инструментария UWP и получить работающее свойство publi c IObservableVector CollectionGroups, чтобы оно могло выполнять группировку? возможности фильтрации.

В документации говорится об использовании интерфейса ICollectionViewGroup для элементов, которые будут храниться в свойстве IObservableVector CollectionGroups, я не могу найти ни одного примера или того, как это реализовать. Вот вся документация, которую имеет Microsoft: https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Data.ICollectionViewGroup?view=winrt-18362

Проще говоря, мне нужен пример того, как реализовать интерфейс ICollectionView с группировкой. Если вы не знаете, как это сделать, тогда, пожалуйста, не т комментарий.

1 Ответ

0 голосов
/ 14 апреля 2020

Взяв исходный код из UWP Toolkit AdvancedCollectionObject, я добавил группировку, основанную на большом количестве проб и ошибок. (не мог найти что-нибудь в Интернете, как это сделать), и, похоже, работает. Я не знаю, правильно ли я это сделал, но вот что я должен был сделать:

Для свойства IObservableVector GroupItems мне пришлось создать свой собственный List и IVectorChangedEventArgs:

  internal class VectorChangedEventArgs : IVectorChangedEventArgs
    {
        public VectorChangedEventArgs(CollectionChange cc, int index = -1, object item = null)
        {
            CollectionChange = cc;
            Index = (uint)index;
        }

        public CollectionChange CollectionChange { get; }

        public uint Index { get; }
    }

public class GroupList<T> : Collection<T>, IObservableVector<T>
    {
        public event VectorChangedEventHandler<T> VectorChanged;

        public GroupList() : base()
        {
        }

        public GroupList(IList<T> list) : base(list)
        {
        }

        protected override void ClearItems()
        {
            base.ClearItems();
            this.OnVectorChanged(new VectorChangedEventArgs(CollectionChange.Reset, 0));
        }

        protected override void InsertItem(int index, T item)
        {
            base.InsertItem(index, item);
            this.OnVectorChanged(new VectorChangedEventArgs(CollectionChange.ItemInserted, index));
        }

        protected override void RemoveItem(int index)
        {
            base.RemoveItem(index);
            this.OnVectorChanged(new VectorChangedEventArgs(CollectionChange.ItemRemoved, index));
        }

        protected override void SetItem(int index, T item)
        {
            base.SetItem(index, item);
            this.OnVectorChanged(new VectorChangedEventArgs(CollectionChange.ItemChanged, index));
        }

        private void OnVectorChanged(IVectorChangedEventArgs e)
        {
            VectorChanged?.Invoke(this, e);
        }
    }

И, согласно Microsoft, у вас должны быть элементы группы, наследующие ICollectionViewGroup:

public class GroupItem : DependencyObject, ICollectionViewGroup
    {
        private IGrouping<object, object> _group;

        public GroupItem(IGrouping<object, object> group)
        {
            _group = group;
        }

        public object Group => _group;

        public IObservableVector<object> GroupItems => new GroupList<object>(_group.ToList());
    }

Теперь, когда источник изменяется на коллекцию, которая использует Linq.IGrouping, он знает, чтобы создать GroupList GroupItems. а элементы управления UWP ListView и Semanti c работают просто отлично. Пожалуйста, дайте мне знать, если у вас есть что добавить к этому или corections

...