【问题标题】:WPF Bind to a Collection of objects, sorted by IDs stored in order in another Collection in C#WPF 绑定到对象的集合,按 C# 中另一个集合中按顺序存储的 ID 排序
【发布时间】:2010-09-14 18:46:56
【问题描述】:

对于那些喜欢谜题的人:我最近遇到了这个问题,并且相信一定有更好的解决方案。

考虑:

  • 一个名为 foosFoo 对象的 ObservableCollection。
  • Foo 包含一个字符串 ID 字段
  • 我无法控制 foos
  • foos 将会改变

然后:

  • 我还有另一个名为 sortLikeThis 的集合
  • sortListThis 包含字符串
  • 字符串是按照 foos 显示顺序的 ID

加号:

  • foos 中可能有 ID 不在 sortLikeThis 中的对象。这些需要放在最后。
  • 同样,sortLikeThis 中的字符串可能不会出现在 foos 中。

有没有一种很好的方法可以按照 sortLikeThis 中的 ID 定义的顺序绑定到 foos 中的 Foo 对象并在 wpf 中显示这些对象?

【问题讨论】:

    标签: c# wpf data-binding sorting collections


    【解决方案1】:

    你看过Bindable LINQ吗?它允许您在可观察集合之上定义 LINQ 查询,并确保每次更改基础集合时都执行 LINQ 查询。在您的情况下,您可以在集合顶部添加一个 Orderby 查询。

    您可以将委托传递给 Orderby 方法以进行比较。要进行此设置,您将

    1. 准备通过创建字典将 sortLikeThis 中的每个 id 映射到升序 int
    2. 在比较委托中,在字典中查找传递用于比较的两个 foo 的 ID。如果找不到项目,请执行适当的操作。

    【讨论】:

      【解决方案2】:

      听起来像是自定义 observable 集合的工作,它实现了 IEnumerable 并且有一个非常小的枚举器(aaah,yield)来处理自定义排序的逻辑。

      public class SortFoosLolThx : ObservableCollection<Foo> {
      public IList<string> SortList {/*...*/}
      /*...*/
      public override IEnumerator<Foo> GetEnumerator() { /*...*/ yield foo; /*...*/}
      }
      

      【讨论】:

      • 您好,我不确定这个解决方案是否有效: 1. 我无法控制 ObservableCollectionfoos - 所以特别是不能把它变成一个可排序的。 2. 如果集合被修改,什么会触发对 SortList 的调用?李
      猜你喜欢
      • 2015-10-18
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多