【问题标题】:CollectionViewSource.SortDescriptions not work when binding items are created using Parallel使用 Parallel 创建绑定项时,CollectionViewSource.SortDescriptions 不起作用
【发布时间】:2016-06-29 09:17:23
【问题描述】:

我正在使用 VS2013、.net4.5、WPF 桌面应用程序。

Xaml:

    <CollectionViewSource x:Key="cvs" Source="{Binding ObsPasses, Mode=OneWay}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="StartDate"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>

cs:

            this.ObsPasses = new ObservableCollection<PassViewModel>(
            Passes.AsParallel().Select(x => new PassViewModel(x)));

如果我删除.AsParallel(),则项目已排序,如果添加,则项目无序。 但我觉得有点奇怪。 SortDescription 是否保证无论项目在后台添加的顺序如何,都可以对 UI 项目进行排序?

【问题讨论】:

  • 在分配ObsPasses 属性后,所有并行操作都已完成,剩下的就是一个未知顺序的ObservableCollection。它不会影响CollectionViewSource 排序功能。这一定是你正在做的其他事情。请提供完整可验证的示例代码。
  • @NovitchiS 在对我的演示项目进行了一些测试后,我发现 SortDescription 不起作用,无论 AsParallel 与否。所以我一定是在某个地方错了,但我找不到。 Demo
  • 只是一个想法 - 您是否尝试在通过 View.Refresh 填充集合后强制 CollectionView 刷新?

标签: c# wpf task-parallel-library task collectionviewsource


【解决方案1】:

快速建议,如果您可以尝试在 CollectionViewSource 上添加 IsLiveFilteringRequested="True"。

让我知道它是否有效。

【讨论】:

    【解决方案2】:

    在您的代码演示中,您没有绑定到 CollectionViewSource,而是绑定到集合本身。换个试试

    <ItemsControl ItemsSource="{Binding ObsFoos, Mode=OneWay}" >
    

    <ItemsControl ItemsSource="{Binding Source={StaticResource cvs}}" >
    

    【讨论】:

    • 这是唯一的答案,我不能用赏金删除这个问题。所以接受谁为我调试。实际上我终于发现这是我的错误,与 Parallel 或 CollectionViewSource 没有关系。 @michauzo,您指出了一个错字,这不是我的第一个根本原因。无论如何,谢谢!
    • 故障与具体技术无关,是业务逻辑问题。所以你不必对此感到好奇。想知道的可以看github
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2013-07-17
    • 2021-08-20
    • 2016-12-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多