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 :

Binding sur ListBox bloquant


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut Binding sur ListBox bloquant
    Bonjour tout le monde,

    dans mon appli WPF actuel, j'ai une page contenant une ListBox de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <ListBox x:Name="lbxCustomer" DataContext="{Binding Source={StaticResource odpCustomer}}" ItemsSource="{Binding}" ScrollViewer.VerticalScrollBarVisibility="Visible" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Label Content="{Binding Path=CustRef}" Width="100" HorizontalAlignment="Left"  VerticalAlignment="Center" />
                            <Label Content="{Binding Path=CustState}" Width="100" HorizontalAlignment="Left" VerticalAlignment="Center" />
                            <Label Content="{Binding Path=CustReasons}"  Width="350" HorizontalAlignment="Left" VerticalAlignment="Center" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    lié au ObjectDataProvider suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Page.Resources>
            <ObjectDataProvider  x:Key="odpCustomer" />
        </Page.Resources>
    + une petit classe Customer, implémentant ObservableCollection, permettant le Binding :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class CustomerBinding
        {
            public string CustRef { get; set; }
            public string CustState { get; set; }
            public string CustReasons { get; set; }
     
            public class CustomerBindingList ObservableCollection<CustomerBinding> { }
        }
    tout ceci marche très bien, à l'exception près que la méthode qui remplit la CustomerBindingList met environ 5 minutes à s'exécuter, temps pendant laquelle la fenêtre est bloqué. :-/

    j'ai tenté plusieurs méthodes, dont celle ci, mais le résultat est souvent pire. (actuellement no seulement la pge se bloque mais en plus la liste n'apparait plus du tout, même après la fin du traitement.)

    Voila le code actuel de ma page xaml.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    private CustomerBinding.CustomerBindingList lstCustomers;
     private delegate void AppelMethodeDelegate();
     
    public pagCustomer()
            {
                InitializeComponent();
     
                lstCustomers = new CustomerBinding.CustomerBindingList();
                AppelMethodeDelegate appel = new AppelMethodeDelegate(GetCustomers);
                this.Dispatcher.BeginInvoke(appel, DispatcherPriority.Background, null);
     
                ObjectDataProvider odpCustomer = this.FindResource("odpCustomer") as ObjectDataProvider;
                if (odpCustomer != null)
                    odpCustomer.ObjectInstance = lstCustomers;
     
                /*lstCustomers.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(lstCustomers_CollectionChanged);*/
            }
     
    private void GetCustomers() 
    {
    // du code pour remplir lstCustomers
    }
     
    private void lstCustomers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs a)
            {
                ObjectDataProvider odpCustomer = this.FindResource("odpCustomer") as ObjectDataProvider;
                if (odpCustomer != null)
                    odpCustomer.ObjectInstance = lstCustomers;
                odpCustomer.Refresh();
            }
    le top, ce serait qu'au chargement de la page, la listbox des customers apparaissent progressivement, et que la page ne soit pas bloqué. Je ne sais même pas si c'est possible... (je sais que ça l'est en windows form cependant)

    Merci d'avance pour tout aide.

  2. #2
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 69
    Par défaut
    Je sais pas si ca marcherait comme tu le souhaites,
    mais tu peux essayer de mettre un évènement Loaded sur ta page
    (qui donc se déclencherait une fois ta page chargé)
    dans lequel tu chargerais ta CustomerBindingList.

    Cependant, je trouve que 5 minutes de chargement c'est un peu beaucoup.
    Je me demande donc s'il n'y a pas un problème à cette endroit là.

  3. #3
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    Merci de t'intéresser à mon cas

    la création de la listbox se fait via des requêtes SQl, une requêtes par ligne... et il peut y avoir environ 10000 clients. Donc non 5 min c'est plutôt raisonnable
    Il est indispensable de voir le début de la liste même si celle-ci n'est pas fini de charger.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    pourqui tu met pas directemtn l'object dans les resources
    style
    <local:custombindingcollection x:key="cbc" />
    et tu sort la collection ou tu en fait une dehors

  5. #5
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    Si j'ai bien compris ta réponse, ce n'est pas possible non plus : quand je ne suis pas sur cette page, je suis sur une autre page WPF, donc mon pb sera reporté sur une autre page...

    J'ai aussi pensé à créer un deuxième vrai Thread, mais la ça va être difficile de reconnecter ma CustomerBindingList à ma ListBox ( ce serai peut être possible à la fin du chargement, mais la ListBox sera vide pendant le chargement )

    J'ai également regardé ce code :
    http://msdn.microsoft.com/fr-fr/library/ms771729.aspx
    j'ai fait la même chose (ajout d'un bouton, la listbox se remplit sur le dispatcher du bouton) mais ça ne marche pas non plus ( alors que bien sur, ça marche dans l'exemple msdn )

  6. #6
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 69
    Par défaut
    Citation Envoyé par thelpi Voir le message
    Merci de t'intéresser à mon cas

    la création de la listbox se fait via des requêtes SQl, une requêtes par ligne... et il peut y avoir environ 10000 clients. Donc non 5 min c'est plutôt raisonnable
    Il est indispensable de voir le début de la liste même si celle-ci n'est pas fini de charger.
    5 minutes, ça me parait beaucoup.
    Est ce que tu refais à chaque fois une nouvelle connexion à ta base de donnée ou tu le gardes en mémoire pour seulement exécuter à chaque fois une simple requête ?

    Est ce qu'il n'est pas possible également d'optimiser en ne faisant qu'une seul requete qui te renvoie tes 10 000 clients ?

  7. #7
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    Bien joué Sephial

    en travaillant sur mon système de requêtes, je passe de 5 min à une dizaine de secondes (j'avoue avoir été un boulet sur le coup )

    Cependant, dix secondes de fenêtre bloqué c'est toujours long, et de plus pouvoir accéder à une fenêtre tout en générant en parallèle la ListBox, je suis sur que ça me sera utile dans d'autres dèv. WPF... je suis donc toujours preneur de solutions!

    @plus

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    si tu veux factoriser cela tu peux aussi les mettre dans les resource de l'application plutot que dans les resources d'une fenetre, ca marche aussi

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

Discussions similaires

  1. bind Click sur Listbox
    Par shaiHulud dans le forum Tkinter
    Réponses: 4
    Dernier message: 10/12/2013, 18h10
  2. WPF Binding sur une listbox
    Par infosam76 dans le forum C#
    Réponses: 4
    Dernier message: 16/06/2011, 22h31
  3. Binding sur les SelectedItems d'une ListBox ne fonctionne pas entièrement
    Par takinelinfo dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 14/06/2011, 10h46
  4. MVVM + Listbox + Multiselect : Bind sur selecteditems ?
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 10/11/2010, 14h04
  5. binding et wpf sur listbox
    Par MarioKart dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 28/07/2009, 19h39

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