【问题标题】:Sorting ObservableCollection by String按字符串对 ObservableCollection 进行排序
【发布时间】:2012-12-11 14:52:51
【问题描述】:

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

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

订购优先级应如下所示: 1) isChecked == 真 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

【问题讨论】:

  • 你有没有尝试过? “sort wpf listbox”的第一个谷歌结果是这个网站上的一个问题......
  • WPF: Sort a list box 的可能重复项
  • 我不仅按字段排序,而且按字符串排序:/(也找到了该解决方案。适用于 1 和 3,但不适用于 2)参见示例

标签: c# wpf xaml


【解决方案1】:

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

 // 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);

【讨论】:

    【解决方案2】:

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

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

    WPF: ListCollectionView for sorting, filtering and grouping

    【讨论】:

    • 是的,但是如何在 ViewSource 上映射排序要求?
    • @HenkHolterman:你有一组对象,你定义了一个比较器,你运行包含特定排序规则的比较器,查看源代码。基本步骤。我证明了与 OP 的具体实现的链接。
    • 但是 #2 是标签等于项目标签,所以需要向 icomparer 传递一个值,界面似乎不支持。
    • 在#2 我理解它就像一组可以定义不同排序键的字段。通过这种方式,您可以获得“排序键”的集合,并在选择其中一个时运行适当的比较器。
    【解决方案3】:

    #2 有点棘手。

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

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

    2标签等于标签

    3 按标签字母顺序

    完全不清楚。三个引用标签。

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

    IsChecked = True 和 Tag = 'match'

    然后追加

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

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

    【讨论】:

    • 2) 将字符串变量与每个项目上的标签进行比较。如果两者相同。这些项目首先列出。 3) 所有其他不符合 1) 和 2) 的项目按其标签按字母顺序排序。例如;项目0:标签=“苹果”;项目1:标签=“小时”; item2: tag = "event"...string variable = "event"... 最终订单:item2, item0 ,item1
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多