Frage

So WPF nicht unterstützt standard-Sortierung oder Filterung Verhalten für die Aussicht auf CompositeCollections, was wäre also eine best-practice Lösung für dieses problem.

Es gibt zwei oder mehr Objekt-Sammlungen von verschiedenen Arten.Sie möchten, kombinieren Sie zu einem einzigen sortierbare und filterbare Auflistung (teilweise mit manuell zu implementieren, zu Sortieren oder zu filtern).

Einer der Ansätze, die ich betrachtet habe, ist ein neues Objekt zu erstellen-Sammlung mit nur ein paar Kern-Eigenschaften, einschließlich diejenigen, die ich möchte, dass die Sammlung sortiert, und eine Objekt-Instanz von jedem Typ.

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

Und dann eine Schleife durch meine zwei Objekt-Sammlungen für den Bau der neuen composite-Sammlung.Offensichtlich ist dies ein bisschen ein brute-force-Methode, aber es würde funktionieren.Ich bekommen würde, alle die Standard-Ansicht Sortieren und filtern Verhalten auf meine neue composite-Objekt-Sammlung, und ich möchte in der Lage sein, eine Vorlage Daten auf die zur Anzeige der Liste meiner Gegenstände ordnungsgemäß je nachdem, welche Art ist eigentlich gespeicherte composite Element.

Welche Vorschläge gibt es für die dies in einem eleganten Weg?

War es hilfreich?

Lösung 3

Update:Ich fand eine viel elegantere Lösung:

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

Ich fand, dass aufgrund der Reflexion, die bestimmten Typs in Obj1 behoben ist, zur Laufzeit und des Typs spezifische DataTemplate ist wie erwartet angewendet!

Andere Tipps

Ich bin noch nicht sehr vertraut mit WPF, aber ich sehe dies als eine Frage über Sortieren und filtern List<T> Sammlungen.

(teilweise mit manuell zu implementieren, Sortieren oder filtern)

Würden Sie überdenken der Umsetzung Ihrer eigenen Art oder filter-Funktionen?In meiner Erfahrung ist es einfach zu bedienen.Die folgenden Beispiele verwenden eine anonyme delegieren, aber Sie könnte leicht definieren Sie Ihre eigene Methode oder eine Klasse zu implementieren, die eine komplexe Sortieren oder filtern.Eine solche Klasse könnte sogar Eigenschaften, die zum konfigurieren und ändern Sie die Sortierung und den filter dynamisch.

Verwenden List<T>.Sort(Comparison<T> comparison) mit Ihrer benutzerdefinierten Funktion vergleichen:

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

Ein ähnlicher Ansatz für die erste sub-Sammlung von Elementen aus der Liste.

Verwenden List<T>.FindAll(Predicate<T> match) mit Ihrem benutzerdefinierten filter Funktion:

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

"Brute-force" - Methode, die Sie erwähnen, ist tatsächlich die ideale Lösung.Denken Sie daran, alle Objekte werden im RAM, es gibt keine I/O-Engpass, so kann man ziemlich viel Sortieren und filtern von Millionen von Objekten in weniger als einer Sekunde, auf jedem modernen computer.

Der eleganteste Weg, um die Arbeit mit Sammlungen-System.Linq-namespace in .NET 3.5

Danke - ich habe auch als LINQ to Objekte, aber meine Sorge es ist der Verlust Flexibilität für eingegebene Daten Vorlagen, die ich brauche, um die Anzeige der Objekte in meiner Liste.

Wenn Sie nicht Vorhersagen können, in diesem moment, wie die Menschen, Sortieren und filtern Sie Ihre Objekt-Sammlung, dann sollte man sich ansehen, System.Linq.Ausdrücke namespace bauen Sie Ihre lambda-Ausdrücke auf Nachfrage während der Laufzeit (erste lassen Sie Benutzer auf Ausdruck erstellen, kompilieren, ausführen und am Ende verwenden Sie reflection-namespace zum Durchlaufen der Ergebnisse).Es ist schwierig zu wrap Ihre Kopf um ihn herum, aber von unschätzbarem Wert Funktion, die wohl (für mich endgültig) noch mehr bahnbrechende Funktion als LINQ selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top