因此 WPF 不支持 CompositeCollections View 的标准排序或过滤行为,那么解决此问题的最佳做法是什么。
有两个或多个不同类型的对象集合。您希望将它们组合成一个可排序和可过滤的集合(而不必手动实现排序或过滤)。
我考虑过的一种方法是创建一个只有几个核心属性的新对象集合,包括我希望对集合进行排序的那些属性,以及每种类型的一个对象实例。
class MyCompositeObject
{
enum ObjectType;
DateTime CreatedDate;
string SomeAttribute;
myObjectType1 Obj1;
myObjectType2 Obj2;
{
class MyCompositeObjects : List<MyCompositeObject> { }
然后遍历我的两个对象集合以构建新的复合集合。显然,这是一种蛮力方法,但它会起作用。我将在我的新复合对象集合上获得所有默认 View 排序和过滤行为,并且我能够在其上放置一个数据模板以正确显示我的列表项,具体取决于该复合项中实际存储的类型。
对于以更优雅的方式执行此操作有什么建议?
最佳答案
我还不是很熟悉 WPF,但我认为这是一个关于排序和过滤的问题 List<T>
收藏。
(withing having to manually implement sort or filter)
您会重新考虑实现自己的排序或过滤功能吗?根据我的经验,它很容易使用。下面的示例使用匿名委托(delegate),但您可以轻松定义自己的方法或类来实现复杂的排序或筛选。这样的类甚至可以具有动态配置和更改排序和过滤器的属性。
使用 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);
}
关于c# - 对复合集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288/