C#/ WPF CollectionView - 如何在特定位置添加项目

时间:2011-07-18 17:08:14

标签: c# wpf collectionview

我正在使用 ListCollectionView 对象来显示项目列表。目前,我正在构建一个屏幕,其中有两个列表 - 一个completeList,包含所有可用项目,另一个sortedList,包含项目顺序的子集相关。这里可能采取的行动是

  • completeList
  • 中添加或删除任何sortedList
  • sortedList
  • 中向上或向下移动项目
  • 保存sortedList
  • 的内容

现在,我的问题是:是否有可能在定义的位置将项目插入sortedList

现在,它们将始终添加到列表的末尾,无论当前标记的项目如何,我没有找到解决方法 - 除了明显的脏黑客,这将让我存储所有项目在所需位置后,从列表中删除它们,添加新项目,然后以正确的顺序重新添加所有存储的项目。

ListCollectionView是否提供任何此类功能,或者是否有另一个可以实现此功能的CollectionView类?

1 个答案:

答案 0 :(得分:2)

你实际上是在寻找一些合乎逻辑的矛盾。假设我按字母顺序排序ListCollectionView

American
Continental
Festival
Imperial
Tower
Worldwide

我应该能够在LuxorAmerican之间插入Continental吗?如果视图已排序,则不会。项目只有一个地方可以去。它出现在视图中的位置与它在底层列表中的显示位置无关。

如果不了解您的应用程序,很难确切地知道建议的内容。但是,如果对集合视图进行排序,则使项目显示在视图中的特定位置的方法是为其排序键分配一个值,一旦刷新视图,该值将使其出现在所需位置。

这样做的一个相当简单(和通用)的方法是向数据项类添加DateTime属性,在项目的构造函数中将其设置为DateTime.Now,并使其成为最后一个排序键视图使用的。然后,在添加新项目时,将其他排序键属性设置为当前所选项目的值。如果这样做,只要您不更改任何排序键属性的值,新项目将始终显示在适当的位置。

话虽如此,根据您想要支持的其他功能,我相信您不应该使用ListCollectionView来处理您所称的sortedList。此列表未排序。它是有序的,这完全不是一回事。当用户在列表中向上移动项目时,您实际上想要更改其位置。

您可能要做的是将列表实现为ObservableCollection,并将其包装在公开ItemsSelectedItemAddNewCommand,{的视图模型类中{1}},MoveUpCommandMoveDownCommand属性。然后,您可以将类SaveCommandItemsSource的{​​{1}}和SelectedItem属性绑定到ListBoxListView属性,并绑定按钮或UI中的超链接或其他任何命令。这些命令将使用ItemsSelectedItem来操纵Items属性,并且由于RemoveInsert,因此用户界面将保持同步。