对 GridView 或其支持的 ObservableCollection 进行排序的正确方法?
Posted
技术标签:
【中文标题】对 GridView 或其支持的 ObservableCollection 进行排序的正确方法?【英文标题】:Correct way to sort GridView or its backing ObservableCollection? 【发布时间】:2022-01-14 21:19:33 【问题描述】:我最近一直在用 WinUI 3 编写一个爱好项目,但遇到了一些麻烦。
在我的应用程序中,我有一个在 XAML 中绑定到 ObservableCollection
的 GridView
,正如 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)
C#:将 BusinessObject 传递给“BusinessLayer”构造函数或其方法?