对复合集合进行排序

因此,WPF不支持CompositeCollections视图的标准排序或过滤行为,因此解决此问题的最佳做法是什么。

有两个或更多不同类型的对象集合。 您希望将它们组合成单个可排序和可过滤的集合(必须手动实现排序或过滤)。

我考虑过的方法之一是创建一个只有少数核心属性的新对象集合,包括我希望对集合进行排序的属性,以及每种类型的对象实例。

class MyCompositeObject { enum ObjectType; DateTime CreatedDate; string SomeAttribute; myObjectType1 Obj1; myObjectType2 Obj2; { class MyCompositeObjects : List { } 

然后遍历我的两个对象集合来构建新的复合集合。 显然这是一种蛮力方法,但它会起作用。 我将获得新的复合对象集合上的所有默认视图排序和过滤行为,并且我可以在其上放置数据模板以根据实际存储在该复合项目中的类型正确显示列表项目。

有什么建议以更优雅的方式做到这一点?

我还不是很熟悉WPF,但我认为这是一个关于排序和过滤List集合的问题。

(必须手动实现排序或过滤)

您是否会重新考虑实施自己的排序或过滤function? 根据我的经验,它很容易使用。 下面的示例使用匿名委托,但您可以轻松定义自己的方法或类来实现复杂的排序或过滤。 这样的类甚至可以具有配置和更改排序和动态过滤的属性。

使用List.Sort(Comparison comparison)与自定义比较function:

 // Sort according to the value of SomeAttribute List myList = ...; myList.Sort(delegate(MyCompositeObject a, MyCompositeObject b) { // return -1 if a < b // return 0 if a == b // return 1 if a > b return a.SomeAttribute.CompareTo(b.SomeAttribute); }; 

从列表中获取项目子集合的类似方法。

使用List.FindAll(Predicate match)与您的自定义filterfunction:

 // Select all objects where myObjectType1 and myObjectType2 are not null myList.FindAll(delegate(MyCompositeObject a) { // return true to include 'a' in the sub-collection return (a.myObjectType1 != null) && (a.myObjectType2 != null); } 

你提到的“蛮力”方法实际上是理想的解决方案。 请注意,所有对象都在RAM中,没有I / O瓶颈,因此您可以在任何现代计算机上在不到一秒的时间内对数百万个对象进行排序和过滤。

处理集合的最佳方式是.NET 3.5中的System.Linq命名空间

谢谢 – 我也考虑过LINQ to objects,但是我担心类型化数据模板失去了灵活性,我需要在列表中显示对象。

如果你现在无法预测人们将如何排序和过滤你的对象集合,那么你应该看看System.Linq.Expressions命名空间在运行时根据需要构建你的lambda表达式(首先你让用户构建表达式,然后编译,运行,最后使用reflection命名空间来枚举结果)。 围绕它而言更为棘手,但是非常宝贵的function,可能(最终确定)比LINQ本身更具突破性function。

更新:我找到了一个更优雅的解决方案:

 class MyCompositeObject { DateTime CreatedDate; string SomeAttribute; Object Obj1; { class MyCompositeObjects : List { } 

我发现由于reflection,存储在Obj1中的特定类型在运行时被解析,并且特定类型的DataTemplate按预期应用!