J'essaie d'implémenter un ListView avec un GridView avec des colonnes triables. Pour trier ListView, je raccorde l'événement Click pour GridViewColumnHeaders et j'ajoute SortDescriptors à la source de vue par défaut (similaire à ce qui est fait dans MSDN).Tri d'un ListView en dérivant GridViewColumnHeader
Quelque chose comme ceci:
<ListView ItemsSource="MY ITEMS SOURCE BINDING">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn DisplayMemberBinding="MY DISPLAYMEMBER BINDING">
<GridViewColumnHeader Content="My Header" Click="ColumnHeaderClicked"/>
Tout cela fonctionne très bien, mais je voudrais généraliser un peu. Pour ce faire, j'ai simplement dérivé GridViewColumnHeader et écrit un click-handler. Je sais qu'il existe de nombreuses implémentations de vues de listes triables qui proviennent généralement de ListView, mais je me demandais simplement si cette approche est possible.
Quelque chose comme ceci:
<ListView ItemsSource="MY ITEMS SOURCE BINDING">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn DisplayMemberBinding="MY DISPLAYMEMBER BINDING">
<local:SortableGridViewColumnHeader Content="My Header"/>
Pour que cela fonctionne, je dois naviguer à partir du code SortableGridViewColumnHeader au contenant ListView afin de définir de nouveaux SortDescriptors.
J'ai essayé de naviguer dans l'échelle Parent, mais GridViewColumnHeader n'est pas un enfant visuel de ma ListView. Je pourrais sûrement créer une propriété de dépendance et la lier à ListView, mais il devrait y avoir un moyen de naviguer à la place.
Comment ferais-je cela dans le code? (Je ne cherche pas de réponses sur la façon de trier un ListViews WPF en général, je me demande si cela peut être fait de cette façon).
EDIT
Il est apparu que ce que je avais besoin était ce chercheur parent dans le clic-gestionnaire de mon dérivé GridViewColumnHeader.
DependencyObject parent = this;
do
{
parent = VisualTreeHelper.GetParent(parent);
if (parent == null) return;
} while (!(parent is ListView));
Maintenant, mon tri fonctionne comme un charme.
Je ne suis pas d'accord que c'est beaucoup plus facile. Le code de la propriété jointe est beaucoup plus complexe que ma simple classe dérivée. Une propriété jointe ajoute certainement un certain nombre d'avantages, mais ce n'est pas aussi simple. Ma question ici n'était pas tellement sur le tri comme comment naviguer vers le ListView contenant. Je peux voir que le code auquel vous faites référence utilise VisualTreeHelper.GetParent. J'ai effectivement essayé cela avant de demander, mais échoué (c'est pourquoi j'ai demandé). Peut-être que c'est juste un bug dans la recherche de mes ancêtres. – Holstebroe
"Le code de la propriété jointe est beaucoup plus complexe que ma simple classe dérivée": oui, c'est. Mais je ne dis pas qu'il est facile de coder, je dis qu'il est facile à utiliser, ce qui est beaucoup plus important à mon humble avis;). En ce qui concerne votre problème de trouver le ListView: peut-être parce que le GridViewColumnHeader n'est pas encore chargé lorsque vous essayez de naviguer dans l'arbre visuel ... Essayez de le faire dans l'événement Loaded –
Le code GridViewSort est en effet une approche inspirante, mais pas plus facile à utiliser pour moi qu'un simple gestionnaire de clic. J'aurais dû modifier le code GridViewSort pour répondre à mes besoins puisque certaines de mes colonnes devraient être triées sur plusieurs propriétés. Il peut être dangereux de déranger le code source de la troisième partie. – Holstebroe