WPF绑定到对象的集合,按在C#中的另一个集合中顺序存储的ID排序

时间:2020-03-06 15:01:18  来源:igfitidea点击:

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

考虑 :

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

然后:

  • 我还有另一个名为sortLikeThis的收藏集
  • sortList这包含字符串
  • 字符串是显示foo的顺序的ID。

加:

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

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

谢谢,

解决方案

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

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

我们是否看过可绑定的LINQ?它允许我们在可观察的集合之上定义LINQ查询,并确保每次更改基础集合时都执行LINQ查询。对于情况,我们可以在集合顶部添加一个Orderby查询。

我们可以将委托委托给Orderby方法,以进行比较。要进行设置,我们将

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