IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Datagrid - MultiValueConverter appelé 2 fois à chaque Refresh


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut Datagrid - MultiValueConverter appelé 2 fois à chaque Refresh
    Bonjour,

    je travaille sur un projet WPF framework 4.0 avec une Datagrid bindée à une collection de données custom.
    Il y a environ 20 propriétés dans les données, et plusieurs milliers d'enregistrements dans la collection.
    J'utilise un MultiValueConverter pour changer le background color de chaque DatagridTextColumn en fonction de certaines règles .

    Lorsque l'utilisateur clique sur un bouton, une règle s'applique et le background des cellules de la grille doit être rafraichi. Ma collection ne change jamais.

    Lorsque j'appelle MyDatagrid.Items.Refresh() ou CollectionViewSource.GetDefaultView(MyDatagrid.ItemsSource).Refresh(), le MultiValueConverter est appelé 2 fois pour chaque cellule visible.
    Lorsque j'appelle MyDatagrid.InvalidateVisual(), ou UpdateLayout(), les cellules ne sont rafraichies que lorsque je bouge le curseur de la grille, ce qui n'est pas acceptable.

    Il y a plusieurs grilles à rafraichir, et chaque grille met environ 190 ms à se redessiner, ce qui est un peu trop à mon goût.
    Pour des raisons de performance, je dois rafraichir les cellules visibles une fois uniquement.
    Comment dois-je procéder ?

    Le binding est en mode OneWay. L'algo utilisé dans le BackgroundConverter est très light, et n'est pas responsable de la lenteur du rafraichissement.

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Problème résolu.
    Merci.

  3. #3
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Par défaut
    Bonjour,

    si possible merci d'indiquer la solution trouvée au problème rencontré.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Bonjour,

    au cas où ça pourrait intéresser quelqu'un, voici la solution que j'utilise pour ma problématique : utilisant le pattern mvvm, c'est mon viewmodel qui se charge d'appeler NotifyPropertyChanged pour toutes les propriétés de mon model dont le background a besoin d'être rafraichi.
    Comme seules certaines cellules du datagrid ont besoin d'être rafraichies, je m'abonne à l'événement ScrollChangedEvent du Scroll afin de déterminer les lignes visibles de la Datagrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DataGrid.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(OnScrollChanged));
     
    private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
        {
          _verticalOffset = e.VerticalOffset;// offset du 1er élément visible
          _viewportHeight = e.ViewportHeight;// nombre d'éléments visibles
          _extentHeight = e.ExtentHeight;// nombre total d'éléments
        }
    Pour le refresh de la grille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = _view.FirstVisibleRowOffset; i < _view.LastVisibleRowOffset; i++)
          {
    	  // pseudo-code
    	    if (NotificationIsNeeded(propertyName)
             NotifyPropertyChanged(propertyName);
          }
    Avec cette solution, je ne notifie que les cellules ayant besoin d'être rafraichies.
    Le background converter n'est appelé que pour les propriétés notifiées.
    Lorsqu'on scroll, le background converter est appelé automatique sans aucune notification nécessaire.
    Je passe ainsi de 190 ms à 2 ms pour le refresh.

    Etant débutant en wpf, je n'ai pas trouvé d'autre solution plus "clean". Ca m'embête de devoir m'abonner à ScrollChangedEvent, mais je ne sais pas comment récupérer ce ViewPort directement.
    Si vous avez d'autres solutions, je suis preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/08/2006, 19h16
  2. Réponses: 3
    Dernier message: 01/08/2006, 13h42
  3. Réponses: 5
    Dernier message: 14/04/2006, 18h58
  4. Perte de session à chaque page, chaque refresh
    Par tio dans le forum Langage
    Réponses: 8
    Dernier message: 22/03/2006, 13h01
  5. Réponses: 7
    Dernier message: 21/03/2006, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo