【问题标题】:Can I set up ICollectionChanged so that new items are always added to the end even though it has Sort Descriptions我可以设置 ICollectionChanged 以便始终将新项目添加到末尾,即使它具有排序描述
【发布时间】:2017-05-10 16:19:12
【问题描述】:

我有一个由 ListCollectionView 包装的 ObservableCollection。 ListCollectionView 显示在网格 (XamDataGrid) 中。

当我将项目添加到我的 observable 集合时,这些项目由 ListViewCollection 公开,按 SortDescriptions 属性定义的顺序排序。

这就是问题所在。我希望新项目出现在我的网格底部,即使现有项目当前已排序。下次用户排序时(通过单击列标题),应该对新项目进行排序。

我正在努力寻找解决此问题的方法。有人遇到过类似的问题吗?

【问题讨论】:

  • ListViewCollection 是你自己写的类,还是你想说 ListCollectionView 或 CollectionViewSource?无论如何,做一个自定义排序。不,您不能在任何意义上“设置 ICollectionChanged”来做任何事情。您是否在文档中看到任何配置选项? (什么?)这可能意味着什么?你知道哪个类负责排序吗?
  • 所以你根本不想使用 SortDescriptions,你想自己排序。去吧。
  • 已更改为 ListCollectionView。感谢您指出 Ed。

标签: c# wpf list sorting listview


【解决方案1】:

解决方案 A:在后台自行管理排序

这里最简单的做法是在后台对数据进行排序(您可以使用 LINQ),然后将其分配给网格 没有排序描述。然后,当您添加项目时,它们只会出现在集合的末尾。当你点击一个标题时,拦截它并相应地对自己进行排序。

解决方案 B:添加另一个 SortDescription

另一种方法是向您的数据添加另一个属性,并首先在该字段上创建一个主要排序,然后按您实际想要排序的内容。例如,您可以添加一个名为 existedBeforeSort 的布尔值。如果你不能修改你的模型,你可以通过一个扩展来完成,你将实际值存储在一个以对象本身为键的字典中。 (这就是DependencyProperties 的工作方式,但这可以适用于任何对象,因为您正在管理存储。)

现在,在网格中,当您单击排序标题时,您要做的第一件事是将所有项目的existedBeforeSort 属性设置为true。由于您的第一个SortDescription 是基于该字段,然后是通过单击标题生成的排序描述,因此所有新添加的项目都将根据需要显示在底部。

第二种方法的技巧是确保在单击排序标题时,您手动确保始终首先插入基于您的existedBeforeSort 属性的SortDescription。从本质上讲,您是在劫持隐含的 SortDescriptions 并注入您的 SortDescriptions 以取代他们的。不过应该不会太难。

希望这会有所帮助!

【讨论】:

  • 很好的答案!!谢谢!我选择了第二种解决方案。我所做的唯一更改是将 existsBeforeSort 设为 int 以便保持自上次排序以来添加的项目的顺序。我只是在添加新项目时增加这个 int。所有其他项目都将 existsBeforeSort 设置为 0。
  • 很高兴能帮上忙!也很好地抓住了这种 int 变化!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多