WPF DataGrid CustomSort pour chaque colonne
J'ai un WPF DataGrid lié à un objet collectionviewsource qui encapsule une ObservableCollection. Cet objet collectionviewsource a deux objectifs principaux:
1) de groupe De chaque élément par une propriété spécifique de T. je suis à l'aide d'un ValueConverter dans le GroupDescription pour obtenir le regroupement de comportement que je veux.
2) Pour trier la grille par un), principalement le nom du groupe (tel que défini ci-dessus) et b) les éléments de groupe. Je suis atteinte de cet par la fixation d'une coutume IComparer à l'objet collectionviewsource " CustomSort la propriété.
Cela fonctionne très bien pour la plupart, cependant dès qu'un en-tête de colonne est cliqué, la logique de tri est remplacée. Je ne veux pas désactiver le tri, mais je me demandais si il était possible d'attribuer un ordre de tri personnalisé pour une colonne spécifique?
Pour rendre les choses un peu plus clair, supposons qu'un utilisateur clique sur 'ColumnA' - à l'heure actuelle, la logique de tri encapsulé par mon CustomSorter est ignorée et le contrôle DataGrid est maintenant triée par cette propriété. Plutôt que le tri par la propriété sélectionnée, je voudrais, au lieu d'inverser la logique de la CustomSorter.
source d'informationauteur trilson86
Vous devez vous connecter pour publier un commentaire.
J'ai créé un couple de propriétés attachées qui traitent ce problème. J'espère que c'est pratique pour quelqu'un!
Première - une interface simple pour votre directionalised comparer. Cela s'étend IComparer mais nous donne un de plus la propriété (SortDirection). Votre application doit utiliser pour déterminer le classement correct des éléments (qui autrement auraient été perdues).
Suivant est le comportement attaché - cela ne signifie deux choses: 1) indique la grille de tri personnalisé logique (AllowCustomSort=true) et b) nous donne la possibilité de définir cette logique au niveau des colonnes.
De l'utiliser, de mettre en œuvre un ICustomComparer (avec un constructeur sans paramètre) et dans votre XAML:
La réponse donnée par trilson86 est excellent. Cependant, le troisième paramètre dans les deux DependencyProperty déclarations est incorrect. Au lieu de DataGrid et DataGridColumn, ils devraient être CustomSortBehaviour, en tant que tel:
J'ai continué à obtenir un avertissement que le AllowCustomSort propriété était déjà inscrit. Une petite recherche m'a conduit à la réponse ici.
En tout cas, c'est une excellente réponse, alors je vous remercie.
Je l'ai fait en remplaçant la OnSorting de l'événement et la mise en œuvre moi-même.
http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.onsorting.aspx
Qui essentiellement signifie re de tri de la ListCollectionView.
Désolé ce n'est pas trop en profondeur une réponse.
J'ai changé @trilson86 la réponse de sorte que vous avez seulement besoin d'un custom trieur de classe pour l'ensemble de la grille de données.
D'abord l'Interface:
Suivant la Bevaviour de la classe qui définit la CustomSorterProperty de telle façon que vous pouvez l'utiliser directement sur la grille de données, pas sur le DateGridRow. Dans HandleCustomSorting() de la propriété SortMemberPath de la CustomSorter ist rempli avec la valeur réelle de la colonne, vous pouvez utiliser cette valeur dans votre CustomSorter pour trier à l'encontre de la colonne souhaitée.
Vous pouvez l'utiliser dans le code XAML comme ceci:
voici de l'extension de @trilson86 ICustomeSorter
qui font de la Trieuse plus générique à utiliser
NumericComparer basé sur cette ressource
http://www.codeproject.com/Articles/11016/Numeric-String-Sort-in-C
vous pouvez l'utiliser dans le cas où vous ajoutant les colonnes par programmation .
"val1" ici, c'est le chemin de liaison pour la colonne, nous avons ajouté , et vous pouvez également utiliser une autre ligne comme un deuxième tri . comme celui-ci .