Ligne de grille de données de virtualisation de problème d'affichage
Nous avons actuellement un DataGrid
qui est lié à un DataTable
. Il dispose également d'un modèle de colonne avec un CheckBox
qui nous ajouter en programmant. Ce but de cet article est suivi de plusieurs sélections dans le DataGrid
.
Une usine est utilisé pour créer le CheckBox
es pour chaque ligne.
Il existe assez peu de dossiers, de sorte que la ligne de virtualisation est définie sur true, de sorte que la performance est acceptable. Cependant, nous assistons à un étrange problème où, si nous vérifions certains CheckBox
es sur les 10 premières lignes, puis faites défiler vers le bas d'environ 50 lignes (la grille a environ 10 lignes visibles à tout moment), il y a un tas d'autres CheckBox
es qui semblent être vérifié au hasard.
Si on désactive la ligne de virtualisation ce problème n'existe pas (mais la performance est terrible). Est-il un moyen de contourner cela? Quelqu'un sait ce que nous faisons peut-être mal?
- quand vous dites que la performance est terrible, après la suppression de la virtualisation, il est terrible sur la charge ou sur parchemin. Si c'est sur la charge, il y a une solution qui va le faire pas terrible, sur scroll est une autre question...
- C'est seulement sur la charge. Toutes les performances est sur la méthode Show de la fenêtre qui contient la grille de données. Avec une ligne de la virtualisation il taks 200ms pour montrer avec 2 500 enregistrements dans la grille de données. Sans ligne de virtualisation, il prend 28 secondes.
- ajout de code pour vous... juste eu à retoucher la performance au travail il y a quelques jours, fonctionne comme un charme
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la recherche de vitesse ListView Gridview est beaucoup beaucoup plus rapide (et a moins de fonctionnalités).
Essayez de désactiver le recyclage des contenants.
Si vous avez activé la Virtualisation parce que la grille de temps de chargement est terrible, alors, voici la solution:
supposons/appel de votre grille de données de la source des éléments de liaison comme "Lignes",
Ajouter une propriété à votre "Ligne" classe IsVisible et basculer lorsque vous souhaitez charger les données (et non pas lorsque thread d'INTERFACE utilisateur décide de résoudre la liaison et la charge de chaque contrôle)
la raison pour laquelle cela fonctionne, c'est parce que lorsque vous chargez la grille, il vérifie la liaison, toutes les lignes sont invisibles, de sorte que le thread d'INTERFACE utilisateur n'a pas à tourner à travers tous vos lignes*colonnes pour les créer, il peut aller à les prochaine chose qu'il doit faire. Vous, d'autre part, peut détecter quand est commode de temps pour transformer les lignes en visible, lorsque la Vue.La visibilité est visible, lorsque le ViewModel chargé les données de quelque part, etc. Donc, vous êtes en contrôle total. Ci-dessous, je suis d'une itération dans mon élément source (lignes) à l'aide d'une tâche (dans un thread d'arrière-plan), mais la définition de la Visibilité sur le thread d'INTERFACE utilisateur.
Dans la Vue, lors d'une grille de données est en cours de chargement ne permet pas de porc le thread d'INTERFACE utilisateur en mettant l'itération de lignes dans le thread d'arrière-plan, puis définissez la Visibilité de vrai. Même si vous êtes sur le thread d'arrière-plan, IsVisible propriété a changé de déclenchera vous mettre à jour.
oublié d'ajouter ExeOnUi code (vous pouvez vérifier l'accès à l'aide de quelque chose d'autre comme whateverControl.Répartiteur.CheckAccess, je viens d'utiliser Microsoft.Les pratiques.ServiceLocator):
Je viens de courir dans les mêmes problème et résolu après l'ajout de
UpdateSourceTrigger=PropertyChanged
de la liaison.