【问题标题】:Issue sorting datagrid问题排序数据网格
【发布时间】:2012-03-22 13:31:41
【问题描述】:

我在WPF中使用了很长时间进行排序的一种技术是创建一个CollectionViewSource并指定SortDescriptions,例如

<Window.Resources>
    <CollectionViewSource x:Key="testView">
        <CollectionViewSource.SortDescriptions>
            <cm:SortDescription PropertyName="FirstName" Direction="Descending"></cm:SortDescription>
            <cm:SortDescription PropertyName="FamilyName"></cm:SortDescription>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>

这对于我抛出的所有内容都非常有效,但 DataGrid 除外。第一次似乎工作正常,但如果我更改数据,那么网格会终止排序。它甚至会杀死使用相同 CollectionViewSource 的其他控件。我在这里创建了一个示例项目

http://www.mikesdriveway.com/misc/GridSortIssue.zip

要测试此问题,请运行项目并单击“刷新数据”按钮。请注意,项目的顺序发生了变化。这只发生一次,再次测试停止并再次运行项目。现在从 DataGrid 中删除 ItemsSource 并再次运行该项目。这一次,当您单击“刷新数据”按钮时,没有任何反应,这意味着排序保持不变。不知何故,网格正在扼杀 CollectionViewSource 中的排序。这是一个错误吗?

干杯, 迈克尔

【问题讨论】:

    标签: wpf xaml wpfdatagrid


    【解决方案1】:

    这很奇怪,据我所知,当源更改时,底层ViewSortDescription 会被清除,因此如果未重新应用 CVS 的SortDescriptions,则不会进行排序没有了。

    一种解决方法是“重置”SortDescriptions

    var cvs = (CollectionViewSource)Resources["testView"];
    var descriptions = cvs.SortDescriptions.ToArray();
    cvs.SortDescriptions.Clear();
    foreach (var descripton in descriptions) cvs.SortDescriptions.Add(descripton);
    

    【讨论】:

    • 虽然不完美,但这是一个很好的解决方法。我已经实现了这个并且它正在工作,谢谢。 MS 似乎制造了一个垃圾网格以维持第三方网格制造商的生存。不幸的是,这些第三方也制造了垃圾网格,所以我们最终别无选择顺便说一句,排序描述没有被清除,它们仍然存在,但由于某种原因停止运行。
    • @MikeKulls:我不会这么说,当然没有什么是完美的,但到目前为止,我在使用默认 WPF 控件时没有遇到太多麻烦,而且我也没有什么特殊要求其他人似乎经常有。
    • @MikeKulls:不,他们确实被清除了,我说的是底层ViewSortDescriptions,即CollectionViewSource.View.SortDescriptions
    • 我认为大多数 WPF 控件都非常出色,除了网格。对我来说,它感觉错误和不完整。对于有意义的 SortDescriptions,它们会从 View 中清除,但仍保留在 CollectionViewSource 中。看起来网格必须有一些代码可以清除它们,这可能与允许通过单击列进行排序有关(尽管我相信默认情况下这是关闭的)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2011-08-14
    • 2015-05-04
    • 2011-05-18
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多