为实现分组的 UWP XAML 创建自定义 ICollectionView 对象

Create custom ICollectionView object for UWP XAML that implements grouping

我需要这样的东西:AdvancedCollectionViewControl 它来自 UWP 社区工具包,我可以让它在自定义 ICollectionView 中正常工作,除非它们没有实现分组。

我需要一个执行过滤、排序和分组的 ICollectionView,这样我就可以将它绑定到一个执行分组并具有 SemanticZoom 控件的 UWP ListView。这在 UWP

中不存在

我如何使用 UWP 工具包示例并让“public IObservableVector CollectionGroups 属性 工作以便它进行分组?我只使用 CollectionViewSource 除非我需要添加的排序和过滤功能.

文档说对将存储在 IObservableVector CollectionGroups 中的项目使用 ICollectionViewGroup 接口 属性;我找不到任何示例或如何实现它。这是 Microsoft 拥有的所有文档:https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Data.ICollectionViewGroup?view=winrt-18362

尽可能简单地说,我需要一个示例来说明如何使用分组实现 ICollectionView 接口。如果您不知道该怎么做,请不要发表评论。

从 UWP 工具包 AdvancedCollectionObject 获取源代码,我根据大量试验和错误添加了分组。 (无法在网上找到任何操作方法)并且它似乎有效。我不知道我是否做对了,但这是我必须做的:

对于 IObservableVector GroupItems 属性 我不得不制作自己的列表和 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 的集合时,它知道创建 GroupItems 的 GroupList,UWP ListView 和语义控件工作得很好。如果您对此有任何补充或修正,请告诉我