2008-08-14 164 views
6

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

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

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

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

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

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

回答

1

更新:我发现了一个更好的解决方案:

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

我发现,由于反射,存储在OBJ1的具体类型在运行时解决,并按预期应用类型特定的DataTemplate!

1

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

最优雅的方式与收集工作是System.Linq的命名空间在.net 3.5

谢谢 - 我也算的LINQ to 对象,但我关心的有用于输入数据 丢失的灵活性 模板,我需要在列表中显示 对象。

如果你不能在这一刻预测人们将如何排序和筛选你的对象集合,那么你应该看看System.Linq.Expressions命名空间在运行过程中建立您的需求,lambda表达式(首先你让用户建立表达式,然后编译,运行,最后使用反射命名空间来枚举结果)。将头围绕在它身上会更棘手,但它的可贵特点,可能(对我而言)更明确地说,比LINQ本身更具突破性。

+0

lubos:谢谢你 - 我也算是LINQ到对象,但我关心的有用于类型化数据模板,这是我需要在我的列表中显示的对象失去弹性。 – 2010-01-19 04:05:11

1

我对WPF还不是很熟悉,但是我把它看作是一个关于排序和过滤List<T>集合的问题。

你会重新考虑实现自己的排序或筛选功能

(不必手动实现排序或筛选withing)?根据我的经验,它很容易使用。下面的示例使用匿名委托,但您可以轻松定义自己的方法或类来实现复杂的排序或过滤器。这样的类甚至可以具有配置和更改动态排序和过滤的属性。

使用List<T>.Sort(Comparison<T> comparison)与您的自定义比较函数:

// Sort according to the value of SomeAttribute 
List<MyCompositeObject> 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<T>.FindAll(Predicate<T> match)与您的自定义过滤功能:

// 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); 
} 
+0

布莱恩:一旦MyCompositeObject建成后,我得到排序和筛选免费为的ICollectionView ..问题的症结是处理单独的对象类型集合的一部分,并把它们当作一个集合。组合集合是创建集合的答案,但不是排序过滤。 – 2010-01-19 04:06:13