为实现分组的 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 和语义控件工作得很好。如果您对此有任何补充或修正,请告诉我
我需要这样的东西: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 和语义控件工作得很好。如果您对此有任何补充或修正,请告诉我