WPF DataGrid ignoriert die Sortierbeschreibung

8

Ich habe hier ein seltsames Problem bezüglich der Sortierung eines WPF DataGrid (System.Windows.Controls.DataGrid in .NET 4.0).

Seine ItemsSource ist an eine Eigenschaft des datacontext-Objekts gebunden:

%Vor%

FahrenView sieht so aus:

%Vor%

Das DataGrid wird sortiert. Es wird jedoch nur bei der ersten Zuweisung eines DataContext sortiert. Danach bewirkt das Ändern des DataContext (durch Auswählen eines anderen "Parental" -Objekts in einer Datenhierarchie) immer noch, dass die Eigenschaft FahrenView ausgewertet wird (ich kann einen BP einfügen und der Debugger stoppt dort), aber die hinzugefügte Sortierungsbeschreibung wird vollständig ignoriert nicht mehr arbeiten.

Auch der Aufruf von fahrtenDG.Items.Refresh () bei jedem DataContextChange hilft nicht.

Ich bin mir ziemlich sicher, dass dies der richtige Weg ist, wenn es darum geht, ein WPF DataGrid zu sortieren, oder? Warum also weigert es sich so hartnäckig zu arbeiten, nachdem es seine Arbeit perfekt gemacht hat, wenn es zum ersten Mal heißt?

Irgendeine Idee? Ich wäre sehr dankbar.

Prost, Hendrik

    
Hendrik Wiese 24.06.2012, 12:14
quelle

7 Antworten

8

Ich habe von DataGrid geerbt, um einen kurzen Blick auf seine Eingeweide zu werfen. Was ich gefunden habe ist, dass aus einigen mysteriösen Gründen, obwohl das erste Mal OnItemsSourceChanged aufgerufen wird, alles in Ordnung erscheint, in jedem folgenden Aufruf von OnItemsSourceChanged die Sortierungsliste der ItemsSource Sammlungsansicht ist leer .

Aus diesem Grund habe ich ein benutzerdefiniertes SetupSortDescription -Ereignis hinzugefügt, das am Ende von OnItemsSourceChanged aufgerufen wird. Jetzt füge ich die Sortierbeschreibungen in die Ereignishandlerfunktion ein, die wie ein Charme arbeitet.

Ich halte dies für einen Fehler im WPF-Toolkit DataGrid.

Hier ist mein überschriebener OnItemsSourceChanged

%Vor%     
Hendrik Wiese 06.08.2012, 14:01
quelle
5

Ich habe Hendriks Antwort ein wenig verbessert, um MVVM statt eines Ereignisses zu verwenden.

%Vor%     
Jon Barker 18.08.2015 17:36
quelle
3

Ich habe das interited DataGrid von kat verwendet, um ein Verhalten für das WPF DataGrid zu erstellen.

Das Verhalten speichert die ursprünglichen Sortier-Beschreibungen und wendet sie bei jeder Änderung von ItemsSource an. Sie können auch eine IEnumerable<SortDescription> angeben, die bei jeder Änderung ein Resort verursacht.

Verhalten

%Vor%

XAML mit optionalem SortDescriptions-Parameter

%Vor%

ViewModel ICollectionView-Setup

%Vor%

Optional: ViewModel-Eigenschaft zum Bereitstellen von änderbaren SortDescriptions

%Vor%     
Juergen 16.07.2015 22:14
quelle
1

Wenn Sie CollectionViewSource.GetDefaultView (..) für die gleiche Collection aufrufen, erhalten Sie das selbe Objekt collectionview zurück, was erklären könnte, warum das Hinzufügen einer identischen Sortierbeschreibungsstruktur keine Änderung auslöst.

fahrtenDG.Items.Refresh () kann nicht funktionieren, da Sie die gebundene Sammlung nicht aktualisieren.

CollectionViewSource.GetDefaultView (_fahrten) .Refresh () sollte funktionieren - ich würde einen Verweis darauf behalten.

Von Ihrer Erklärung her bekomme ich die Änderung des Datenkontexts nicht ganz - ändern Sie sie in ein neues Objekt? Wenn ja, sollten alle Bindungen neu bewertet werden. Ist die selbe Sammlung immer vorhanden und ändert sich Ihre Index-Eigenschaft in den Listenelementen, und das ist der Grund, warum Sie eine Änderung erwarten - wenn Ihr Listenelement möglicherweise eine INotifyPropertyChanged-Implementierung benötigt, denn wenn sich die Sammlung nicht ändert, besteht keine Notwendigkeit Erholungsort.

Ihre OnItemsSourceChanged (..) Implementierung scheint wie ein Hack zu sein:)

    
Rune Andersen 03.08.2012 11:07
quelle
1

Ich versuchte, dieses Problem mit dem View-Modell zu umgehen - indem ich ICollectionView im Getter neu erstellte und verzweifelt DeferRefresh () aufruft. Ich kann jedoch bestätigen, dass Hendriks Lösung die einzige ist, die zuverlässig funktioniert. Ich wollte den vollständigen Code unten posten, falls es jemandem hilft.

ANSICHT

%Vor%

MODELL ANSEHEN

%Vor%

BENUTZERKONTROLLE

%Vor%     
kat 18.03.2014 18:47
quelle
0

Ich unterstütze Juergens Ansatz , ein angehängtes Verhalten zu verwenden. Da jedoch meine Version dieses Problems entstand, als ich das CollectionViewSource-Objekt in der View-Model-Klasse deklariert hatte, fand ich es direkter, das Problem durch Hinzufügen des Ereignishandlers SortDescriptions_CollectionChanged zu beheben, wie im folgenden Code gezeigt. Dieser Code befindet sich vollständig innerhalb der View-Modellklasse.

%Vor%     
Tony Pulokas 24.11.2016 00:47
quelle
0

Danke! Das hat mich verrückt gemacht! Ich habe Ihren Code an meine Bedürfnisse angepasst. Es besteht grundsätzlich die Sortierung Beschreibungen und stellt sie wieder her, wenn sie weggeblasen werden. Dies kann anderen helfen:

%Vor%     
adamjhilton 03.11.2017 20:13
quelle