对 GridView 或其支持的 ObservableCollection 进行排序的正确方法?

Correct way to sort GridView or its backing ObservableCollection?

我最近一直在用 WinUI 3 编写一个业余项目,运行 遇到了一些麻烦。

在我的应用程序中,我有一个 GridView,它按照 WinUI 文档中的建议在 XAML 中绑定到 ObservableCollection。这很好用,但现在我需要能够对 GridView 中的项目进行排序和过滤,目前还不清楚最“正确”或最惯用的方法是什么。

Google 显示 WPF 在 CollectionViewSource 中有一些位来处理这个问题,但这些似乎已在 WinUI 中删除。

目前我发现唯一可行的方法是删除 XAML 绑定,将 ObservableCollection 更改为 List,然后在用户排序时手动设置将 GridView 的源设置为 null,然后将源设置为 List 的排序版本。如果我没记错的话,这会破坏 GridView 中的虚拟化,所以它看起来不像我应该做的。

我将不胜感激任何对此的见解。

在 WinUI 中,您应该自行对源集合进行排序,即 ObservableCollection<T>

这是来自 here 的经过修改(并且相当未经测试)的 BubbleSort 方法,应该会派上用场:

public static class ObservableCollectionExtensions
{
    public static void BubbleSort<T>(this ObservableCollection<T> o) where T : IComparable
    {
        for (int i = o.Count - 1; i >= 0; i--)
            for (int j = 1; j <= i; j++)
            {
                IComparable o1 = o[j - 1];
                IComparable o2 = o[j];
                if (o1.CompareTo(o2) > 0)
                    o.Move(j - 1, j);
            }
    }
}

用法:

someObservableCollection.BubbleSort();

我不确定这种 UWP 排序方法是否与 WinUI 3 完全兼容,因为我还没有尝试过。 但是 Contoso Orders Example https://github.com/microsoft/Windows-appsample-customers-orders-database 有一些示例代码可以在从 Datagrid 触发排序事件时更改 Datagrid。参考Views文件夹中的DataGridHelper。