문제

따라서 WPF는 CompositeCollections 뷰에 대한 표준 정렬 또는 필터링 동작을 지원하지 않으므로 이 문제를 해결하기 위한 모범 사례는 무엇입니까?

서로 다른 유형의 개체 컬렉션이 두 개 이상 있습니다.이를 정렬 및 필터링이 가능한 단일 컬렉션으로 결합하려고 합니다(정렬 또는 필터를 수동으로 구현해야 함).

제가 고려한 접근 방식 중 하나는 컬렉션을 정렬하려는 속성과 각 유형의 개체 인스턴스를 포함하여 몇 가지 핵심 속성만 사용하여 새 개체 컬렉션을 만드는 것입니다.

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

그런 다음 두 개의 개체 컬렉션을 반복하여 새로운 복합 컬렉션을 만듭니다.분명히 이것은 약간의 무차별적인 방법이지만 작동할 것입니다.새로운 복합 개체 컬렉션에 대한 모든 기본 보기 정렬 및 필터링 동작을 얻을 수 있으며, 해당 복합 항목에 실제로 저장된 유형에 따라 목록 항목을 적절하게 표시하기 위해 데이터 템플릿을 여기에 배치할 수 있습니다.

이 작업을 보다 우아한 방식으로 수행하기 위한 어떤 제안이 있습니까?

도움이 되었습니까?

해결책 3

업데이트:훨씬 더 우아한 솔루션을 찾았습니다.

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

리플렉션으로 인해 Obj1에 저장된 특정 유형이 런타임에 확인되고 유형별 DataTemplate이 예상대로 적용되는 것을 발견했습니다!

다른 팁

저는 아직 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);
}

당신이 언급한 "무차별 대입" 방법은 실제로 이상적인 솔루션입니다.모든 개체는 RAM에 있고 I/O 병목 현상이 없으므로 최신 컴퓨터에서는 1초도 안 되는 시간에 수백만 개의 개체를 정렬하고 필터링할 수 있습니다.

컬렉션을 사용하는 가장 우아한 방법은 .NET 3.5의 System.Linq 네임스페이스입니다.

감사합니다 - 나는 또한 객체에 대한 LINQ를 고려했지만 내 우려는 타이핑 된 데이터 템플릿에 대한 유연성 상실이 있으며, 이는 내 목록에 객체를 표시해야합니다.

지금 당장 사람들이 개체 컬렉션을 어떻게 정렬하고 필터링할지 예측할 수 없다면 다음을 살펴봐야 합니다. System.Linq.Expressions 런타임 중 요청 시 람다 표현식을 빌드하기 위한 네임스페이스(먼저 사용자가 표현식을 빌드한 다음 컴파일하고 실행하고 마지막에는 리플렉션 네임스페이스를 사용하여 결과를 열거함)머리를 감싸는 것은 더 까다롭지만 귀중한 기능입니다. 아마도 (확실히 제게는) LINQ 자체보다 훨씬 더 획기적인 기능일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top