Laden...

Sortierung (mit) einer CollectionViewSource

Erstellt von perlfred vor einem Jahr Letzter Beitrag vor einem Jahr 458 Views
P
perlfred Themenstarter:in
261 Beiträge seit 2010
vor einem Jahr
Sortierung (mit) einer CollectionViewSource

Hallo!

Ich habe im Netz nichts gefunden ...

Es geht auch mehr darum, ob das Konzept so passt.

Aus einer Benutzerauswahl erstelle ich eine Liste (SortierungsEinträge) die das Sortierfeld und die Sortierrichtung der zu sortierenden Felder enthält.
In einer Schleife durchlaufe ich alle Einträge und fülle die SortDescription-Collection der CollectinViewSource.


foreach (SortierungsEintrag aktSortierEintrag in SortierungsEinträge)
{
    if (!aktSortierEintrag.Aktiv || string.IsNullOrEmpty(aktSortierEintrag.FeldName)) continue;     // Die akt. Sortierung ist nicht aktiv oder der Name des Sortierfeldes "fehlt" -> zum nächsten Sortiereintrag navigieren.
    else
    {
        SortDescription sdDatenView = new(aktSortierEintrag.FeldName, aktSortierEintrag.Richtung);  // Sortierung (aus den Sortier-Eintrag Werten) erstellen
        CvsDatenListe.SortDescriptions.Add(sdDatenView);                                            // Sortierung auf die CollectionViewSource übertragen (Die Sortierung selbst wird erst mit der Refresh-Methoder der DatenView ausgeführt
    }
}


Mein Problem / Bedenken ist nun, dass nach jeder Hinzufügung einer SortDescription die Filter-Methode des Filter-Events des CollectionViewSource-Filter's ausgeführt wird.
Es werden also zig Tausend Einträge bei jedem Hinzufügen einer Sortierung durchlaufen bevor die nächste Sortierung verarbeitet werden kann.

Ich hätte gern erst alle Sortierungen zu einer Sortierungs-Collection zusammengefasst und diese (nur 1x) der CollectionViewSource.SortDescription-Eigenschaft zugeordnet.

Es gibt ja ein SortDescriptionCollection-Objekt. Diesem kann ich auch alle SortDescription-Objekte meiner SortierungsEinträge-Liste hinzufügen, aber diese SortDescriptionCollection kann ich nicht der CollectionViewSource.SortDescription-Eigenschaft zuordnen.

Fehlermeldung:
Fehler CS0200 Für die Eigenschaft oder den Indexer "CollectionViewSource.SortDescriptions" ist eine Zuweisung nicht möglich. Sie sind schreibgeschützt.

Bleiben also 3 Möglichkeiten:

A - Die Vorgehensweise der einzelnen Zuordnung der Sortierungs-Einträge ist richtig.

B - Die Sortierungs-Collection kann auf anderem Weg der CollectionViewSource.SortDescription-Eigenschaft zugeordnet werden.

C - Das Filter der CollectionViewSource muss während der Sortierung deaktiviert werden.

D - Bin ich noch nicht darauf gekommen 😉

F
10.010 Beiträge seit 2004
vor einem Jahr

Daten der Source merken, auf null setzen, SortDescriptions setzen, Source wieder auf die ursprünglichen daten setzen

P
perlfred Themenstarter:in
261 Beiträge seit 2010
vor einem Jahr

Hallo FZelle!

Antwort D! 🙂

Funktioniert perfekt!!!! Der Filter wird erst mit der Zuordnung der geparkten Daten zur CollectionViewSource ausgeführt.


/// <summary>
/// Aktualisiert die Sortierung in Abhängigkeit der Aktiven Einträge der Sortierungs-Eintrags-Liste.
/// </summary>
public void RefreshSortierung()
{
    object myDaten = CvsDatenListe.Source;                                                              // Daten "Parken"
    CvsDatenListe.Source = null;                                                                        // Der CVS die Source entziehen 
    CvsDatenListe.SortDescriptions.Clear();                                                             // Alle/Alte Sortierung (immer) löschen

    foreach (SortierungsEintrag aktSortierEintrag in SortierungsEinträge)
    {
        if (!aktSortierEintrag.Aktiv || string.IsNullOrEmpty(aktSortierEintrag.FeldName)) continue;     // Die akt. Sortierung ist nicht aktiv oder der Name des Sortierfeldes "fehlt" -> zum nächsten Sortiereintrag navigieren.
        else
        {
            SortDescription sdDatenView = new(aktSortierEintrag.FeldName, aktSortierEintrag.Richtung);  // Sortierung (aus den Sortier-Eintrag Werten) erstellen
            CvsDatenListe.SortDescriptions.Add(sdDatenView);                                            // Sortierung auf die CollectionViewSource übertragen (Die Sortierung selbst wird erst mit der Zuordnung der geparkten Daten zur CollectionViewSource, ausgeführt.)
        }
    }
    CvsDatenListe.Source = myDaten;                                                                     // Geparkte Daten der CollectionViewSource wieder zuordnen
}

Vielen Dank!