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

Posted

技术标签:

【中文标题】对 GridView 或其支持的 ObservableCollection 进行排序的正确方法?【英文标题】:Correct way to sort GridView or its backing ObservableCollection? 【发布时间】:2022-01-14 21:19:33 【问题描述】:

我最近一直在用 WinUI 3 编写一个爱好项目,但遇到了一些麻烦。

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

谷歌搜索显示 WPF 在 CollectionViewSource 中有一些位来处理此问题,但这些位似乎已在 WinUI 中删除。

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

我将非常感谢您对此的任何见解。

【问题讨论】:

docs.microsoft.com/en-us/windows/winui/api/… 【参考方案1】:

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

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

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();

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于对 GridView 或其支持的 ObservableCollection 进行排序的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

关于GridView Master-Detail 不支持明细属性为IEnumerableIList问题

GridView 对比HTML 表格 (ASP.net 2.0)

找不到模块“./App.svelte”或其对应的类型声明

C#:将 BusinessObject 传递给“BusinessLayer”构造函数或其方法?

无法在 facebook 上共享 .fla 文件或其发布的 html 版本

从右到左 GridView For Asp.net MVC