WPF – Utilisation d’un comparateur personnalisé lors du sorting sur plusieurs colonnes

J’ai un ListView (GridView) que je veux sortinger sur 2 colonnes, donc si 2 éléments ou plus ont la même valeur dans la colonne 1, ils sortingent par la colonne 2. Plutôt facile. Mais les chaînes vides apparaissent en haut lors du sorting de AZ. Je voudrais les déplacer vers le bas. J’ai fait un comparateur (IComparer) qui prend soin de cela, mais je ne sais pas comment l’utiliser.

Voici le code que j’ai essayé:

Dim view As ListCollectionView = CollectionViewSource.GetDefaultView(myCollection) Using view.DeferRefresh view.SortDescriptions.Clear() view.SortDescriptions.Add(New SortDescription(sortHeader.Header, direction)) view.SortDescriptions.Add(New SortDescription(otherColumn, direction)) view.CustomSort = New MyComparer() End Using 

Le problème est que mon comparateur reçoit un type de ma classe au lieu de la valeur de la propriété / colonne en cours de sorting. Donc, si la classe est Foo et que je sortinge par Foo.Bar, je reçois la classe entière de Foo, et pas seulement la valeur de Bar (ce qui est vraiment tout ce qui devrait l’inquiéter, puisque c’est avec cela qu’elle sortinge).

Comment mon comparateur saura-t-il quelle propriété comparer? Peut-être que je fais quelque chose de mal ici, parce que cela n’a aucun sens. Je m’attendais à obtenir une chaîne (le type de propriété) pour x et y …

Est-ce que quelqu’un sait comment faire ça?

L’object entier sera atsortingbué à votre implémentation IComparer . Vous devez déterminer la colonne sur laquelle vous cliquez, probablement en procédant comme IComparer :

 this.AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(Column_Sort)); 

et puis alimentez cela dans votre MyComparer probablement en modifiant votre constructeur pour prendre en compte le chemin de la propriété.

Dans Column_Sort vous pouvez obtenir le chemin de la propriété comme ceci (je suis un peu rouillé sur vb, mais c # ferait ceci:

 void Column_Sort(object sender, RoutedEventArgs e) { var memberBinding= ((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding; var path = ((Binding)memberBinding).Path.Path; } 

puis alimentez cela dans votre logique de sorting.

 Dim view As ListCollectionView = CollectionViewSource.GetDefaultView(myCollection) Using view.DeferRefresh view.SortDescriptions.Clear() view.SortDescriptions.Add(New SortDescription(sortHeader.Header, direction)) view.SortDescriptions.Add(New SortDescription(otherColumn, direction)) view.CustomSort = New MyComparer(PropertyPath) End Using 

EDIT: Il vous suffit de personnaliser votre IComparer pour prendre en charge le sorting de plusieurs colonnes. J’ai IComparer dans IComparer et trouvé cette implémentation de comparateur vous permettant de l’alimenter de plusieurs chemins de propriété séparés par des virgules et suffixés de ASC / DESC comme ceci:

 User.LastName DESC, User.FirstName DESC 

Je pense que la convention pour le sorting sur plusieurs colonnes en ce qui concerne l’interface utilisateur est que vous devez Ctrl bouton Ctrl enfoncé. Donc, sous-classez la classe ListView et associez-la à l’événement cliqué GridViewColumnHeader et à l’événement KeyDown pour savoir quelles colonnes ont été cliquées successivement, puis utilisez une implémentation IComparer pour alimenter cela.