7

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

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

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

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

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

以更优雅的方式执行此操作有什么建议?

4

3 回答 3

1

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

使用集合最优雅的方式是 .NET 3.5 中的 System.Linq 命名空间

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

如果您目前无法预测人们将如何对您的对象集合进行排序和过滤,那么您应该查看System.Linq.Expressions命名空间以在运行时按需构建您的 lambda 表达式(首先让用户构建表达式,然后编译,运行,最后你使用反射命名空间来枚举结果)。将你的头绕在它周围更棘手,但它是无价的特性,可能(对我来说肯定)比 LINQ 本身更具开创性的特性。

于 2008-08-14T16:38:03.430 回答
1

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

(不得不手动实现排序或过滤)

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

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);
}
于 2008-08-14T18:37:22.613 回答
1

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

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

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

于 2008-08-23T03:48:11.093 回答