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 :

Filtrer une listView avec un predicate


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Par défaut Filtrer une listView avec un predicate
    Bonjour,

    Je suis en train de galérer sur ma fonction de filtre dans une listView.
    J'utilise le code suivant pour lancer la procédure de filtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    this.Cursor = Cursors.Wait; // Indicate to user that operation can be long
    ICollectionView view = CollectionViewSource.GetDefaultView(listView.Items);
    view.Filter = new Predicate<object>(FilterCallback));
    this.Cursor = Cursors.Arrow; // End long operation
    Tout fonctionne sauf mon Cursors.Arrow qui est appelé directement sans attendre la fin de ma fonction FilterCallback.
    J'aurais besoin d'un coup de main pour essayer de comprendre comment ça fonctionne et sur quoi je peux m'orienter pour attendre la fin du Filter Predicate.
    Merci pour vos avis !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Rebonjour PetitRasta,
    Utilises à la place "Mouse.OverrideCursor".
    Regarde ici pour les détails.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Par défaut
    Re Ph_Gr,

    En fait ça ne répond pas vraiment à ma problématique...
    Mon réel problème c'est l'appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Cursor = Cursors.Arrow;
    ou à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    finally
    {
        Mouse.OverrideCursor = null;
    }
    Cet appel se fait sans attendre la fin de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    view.Filter = new Predicate<object>(FilterCallback));
    Pour chaque ligne de ma collection, il y a un a appel à la fonction FilterCallback.
    C'est en sorte un Thread qui se charge de filtrer de façon autonome et ligne par ligne.
    Le thread principale n'attend pas la fin du "thread" annexe, c'est ça qui m'enlève mon cursors.await avant la fin du filtrage

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Petit Rasta Voir le message
    Cet appel se fait sans attendre la fin de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    view.Filter = new Predicate<object>(FilterCallback));
    Pour chaque ligne de ma collection, il y a un a appel à la fonction FilterCallback.
    C'est en sorte un Thread qui se charge de filtrer de façon autonome et ligne par ligne.
    Le thread principale n'attend pas la fin du "thread" annexe, c'est ça qui m'enlève mon cursors.await avant la fin du filtrage
    A ma connaissance, l'appel du filtre de la collection se fait sur le même thread que l'IHM, donc normalement les callbacks sont appelés sur le même thread... Donc à mon avis, le problème c'est plutôt que l'IHM n'a pas le temps de rafraîchir le curseur de la souris.
    Si tu es en Framework 4.5, essaye de faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    this.Cursor = Cursors.Wait; // Indicate to user that operation can be long
    await Task.Delay(10); //ça permettra au curseur d'avoir le temps de changer de forme
    ICollectionView view = CollectionViewSource.GetDefaultView(listView.Items);
    view.Filter = new Predicate<object>(FilterCallback));
    this.Cursor = Cursors.Arrow; // End long operation
    et mets bien un "async" sur l'appel de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    async void MaMethode() { ... }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Par défaut
    Oui tu dois avoir raison pour le thread puisque l'UI se bloque quand je réalise les traitements.
    Je n'ai pas pu tester ton code, je suis malheureusement en 4.0 avec VS 2010

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Petit Rasta Voir le message
    Oui tu dois avoir raison pour le thread puisque l'UI se bloque quand je réalise les traitements.
    Je n'ai pas pu tester ton code, je suis malheureusement en 4.0 avec VS 2010
    Ah, mince, ça c'est dommage.
    En Framework 4.0, c'est un peu plus compliqué mais c'est jouable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    this.Cursor = Cursors.Wait; // Indicate to user that operation can be long
     
    Task.Factory.StartNew(()=> { Thread.Sleep(10); })
    .ContinueWith(tsk =>
    {
    ICollectionView view = CollectionViewSource.GetDefaultView(listView.Items);
    view.Filter = new Predicate<object>(FilterCallback));
    this.Cursor = Cursors.Arrow; // End long operation
    }, TaskContinuationOptions.ExecuteSynchronously);
    Notes bien le "TaskContinuationOptions.ExecuteSynchronously" en second paramètre sur le "ContinueWith" qui va lui indiquer que ça doit être fait sur le même thread que l'appelant de la tâche d'origine.

Discussions similaires

  1. Remplir une ListView avec le contenu d'une requête
    Par callo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2006, 08h44
  2. Filtrer une requete avec un autre parametre
    Par fadedstar dans le forum Access
    Réponses: 1
    Dernier message: 25/05/2006, 12h02
  3. Filtrer une requete avec une variable array
    Par hugo69 dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/11/2005, 14h33
  4. Remplir une ListView avec une BD
    Par manikou dans le forum MFC
    Réponses: 1
    Dernier message: 17/05/2005, 09h48
  5. comment filtrer une table avec deux criteres càd 2 colonnes
    Par athmane2dz dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2004, 15h25

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