0

我有一个可观察的集合,集合的一个项目有一个标签(字符串)和一个 isChecked(布尔值)。

用户可以选择一个标签来对列表进行排序,例如“事件”和/或设置 IsChecked。

排序优先级应该像这样工作:1)isChecked == true 2)标签等于项目标签 3)其余项目按标签按字母顺序排序

我通过 xaml 在 ListBox 中显示 ObservableCollection。知道如何实现吗?

EDIT: providing example for clarification:
item0: tag = "apple", isChecked = false;
item1: tag = "apple", isChecked = true;
item2: tag = "pineapple", isChecked = false;
item3: tag = "coconut", isChecked = true;
item4: tag = "cherry", isChecked = false;

string is: "cherry"
outcome: item1, item3, item4, item0, item2
4

3 回答 3

2

为了能够检索您的条件,我执行了以下操作。

 // Retrieve an IQueryable for the colleciton with your specified conditions
 var query = from c in collection
             orderby c.IsChecked descending, c.Tag.Equals("cherry") descending, c.obsTag
             select c;

 // Clear the collection
 collection = new ObservableCollection<myCollectionObject>();
 // Replace the collection with your IQueryable results
 foreach(myCollectionObject obj in query) {
      collection.Add(obj);
 }

如果您想在一行中完成所有操作:

 collection = new ObservableCollection<obsCol>(from c in collection 
              orderby c.obsCheck descending, c.obsTag.Equals("cherry") descending, c.obsTag 
 select c);
于 2012-12-11T16:33:11.153 回答
1

要与 UI 和模型的实现分开,您必须使用CollectionViewSource

如何通过一些自定义比较器对对象列表进行排序的具体示例可以在此处找到:

WPF:ListCollectionView 用于排序、过滤和分组

于 2012-12-11T14:55:46.163 回答
0

#2有点棘手。

为此,您可能需要在后面的代码中有另一个 Public Enumerable,它分两步构建。

OP请在我走这条路之前澄清#2是什么。

2 标签等于标签

3 按字母顺序按标签

一点都不清楚。三引用标签。

根据您的评论需要顶部建立两组列表
问题陈述不反映评论。
你不能指望人们阅读评论。

IsChecked = True 和 Tag = '匹配'

然后追加

IsChecked = false 或 Tag != 'match' order by tag

抱歉,我现在没有时间使用 LINQ,老实说,您并没有在一个好的问题陈述上付出太多努力。

于 2012-12-11T15:00:56.083 回答