2016-01-15 4 views
0

J'utilise un DataGrid WPF lié à une ItemsSource personnalisée qui implémente IList (et non IEnumerable). ItemsSource personnalisé effectue la virtualisation des données et charge uniquement les pages d'éléments selon les besoins. MyDataGrid hérite réellement de DataGrid et remplace le traitement des méthodes de tri DataGrid pour que je puisse maintenir la virtualisation des données pendant le tri. J'ai la virtualisation de l'interface utilisateur activée pour MyDataGrid. Lorsque j'exécute l'application, MyDataGrid s'affiche très bien, me dit que j'ai environ 20 000 éléments, et ne demande que ma ItemsSource pour les 20 premiers éléments. Je peux ensuite cliquer sur les en-têtes de colonne pour trier les différentes colonnes et encore une fois mon ItemsSource doit seulement recharger la première page de 40 éléments parce que MyDataGrid a demandé de ne rafraîchir que les 20 premières. MAIS, quand je clique sur ma colonne de nom pour trier, MyDataGrid perd sa virtualisation d'IU et demande à ma ItemsSource de charger chaque élément même s'il n'a besoin que des 20 premières. Je peux regarder comme il demande chaque élément par index (ceci [0]). J'ai essayé de rechercher ICollectionView, la virtualisation de l'interface utilisateur et la virtualisation des données et la seule chose que j'ai lu qui semble s'appliquer concerne la sélection de plusieurs lignes (à DataGrid row request patterns with data virtualization). J'ai défini le mode de sélection de MyDataGrid sur Single. Un autre indice peut être que, avant de trier par nom de famille, le premier élément de MyDataGrid a un nom de famille qui commence par la lettre V (très tard dans l'alphabet), et que je peux effectivement trier la liste dans l'ordre décroissant par nom de famille sans perdre la virtualisation.La même chose arrive avec ma colonne Titre qui a un premier élément qui commence par la lettre S. Je n'ai pas le problème avec l'une des autres colonnesWPG DataGrid perd la virtualisation lorsqu'il est trié par des colonnes spécifiques

Des idées?

Répondre

1

DÉCOUVRIR !!! En regardant à travers la pile d'appels, il est apparu que le problème se produisait pendant le MeasureOverride du VirtualizingStackPanel et j'ai remarqué qu'il appelait la méthode SyncUniformSizeFlags. Donc, je suis ensuite allé dans le style par défaut pour le DataGrid et définir le RowHeight à un montant fixe et il ne provoque plus le problème. Ainsi, il semble que DataGrid puisse perdre sa virtualisation lorsqu'un RowHeight fixe n'est pas défini. Je ne sais toujours pas pourquoi opter pour trier par ordre croissant par nom ou titre l'a amené à vouloir resynchroniser les hauteurs de lignes, mais je peux contourner celui-ci.