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 dynamique sur un ListBox


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 756
    Par défaut Binding dynamique sur un ListBox
    Bonjour

    Je réalise en ce moment un utilitaire permettant de diagnostiquer les problèmes d'une application. Dans cet perspective, on dispose d'une collection (ObservableCollection) de tests à réaliser, avec un affichage dynamique des résultats au fur et à mesure que ceux ci tombent (ils s'exécutent dans un Thread parallèle). Niveau interface, j'ai une listview contenant les tests à réaliser, et un listbox qui doit contenir le log de mes tests. Mon souci se situe au niveau du binding entre cette dernière et les logs proprement dits.

    La classe décrivant les tests s'organise ainsi :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    abstract public class Test : ITestDiagnosticTool, INotifyPropertyChanged
        {
            #region Attributs
     
            private List<string> _testLog = new List<string>();
            private EtatTest _testResult = EtatTest.Pending;
            public enum EtatTest { True, False, Pending };
     
            #endregion
            #region Proprietes
     
            public EtatTest TestResult
            {
                get { return _testResult; }
                set {
                    RaisePropertyChanged("TestResult");
                    _testResult = value;
                }
            }
     
            public List<string> TestLog
            {
                get { return _testLog; }
                set {
                    RaisePropertyChanged("TestLog"); 
                    _testLog = value;
                }
            }
     
            public string LogAsString
            {
                get
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (var l in TestLog)
                    {
                        sb.AppendLine(l);
                    }
                    return sb.ToString();
                }
            }
     
            #endregion
     
    //       ... méthodes de traitement ...
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            protected void RaisePropertyChanged(String propertyName){
                if (PropertyChanged != null){
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    TestResult me permet d'afficher le résultat de mes tests dans la listview, TestLog va collecter les sorties log au fur et a mesure de l'avancement du traitement, et LogAsString va permettre d'en faire une String exploitable pour l'affichage pour l'utilisateur.

    Mon souci, c'est que je n'arrive pas à lier le contenu du listbox avec la propriété LogAsString ou TestLog ni à faire en sorte que l'affichage se mette à jour dès que le log est modifié.

    Edit : je n'ai pas mis le code du ListBox car il est atm vide, à force de tester et de supprimer, il ne reste que les balises d'ouverture et de fermeture ^^

  2. #2
    Membre expérimenté
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Par défaut
    Sans le Xaml ce n'est pas evident de te répondre, mais déjà je remplacerait la List par une ObservableCollection initialiser. Ensuite a aucun moment tu ne fait de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RaisePropertyChange ("LogAsString")
    ton interface graphique n'est donc jamais informé du changement de sa valeurs. Au pire tu peut te faire un méthode RaiseChanges qui lance les RaisePropertyChange pour toutes les propriété et la lancer que le log arrive c'est aussi a ce moment que tu ferais un Clear et des Add sur l'ObservableCollection.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 756
    Par défaut
    Merci pour ta réponse.

    Voici le xaml du listbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
           <ListBox Margin="408,11,12,44" 
                     x:Name="listBoxResutatsTests" 
                     ClipToBounds="True" FontSize="10" 
                     ScrollViewer.IsDeferredScrollingEnabled="True" 
                     ScrollViewer.CanContentScroll="False"
                     ><!--ItemTemplate="{StaticResource listBoxTemplate}"-->
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=LogAsString,UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    Elle est initialisée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listBoxResutatsTests.ItemsSource = ListeTests;
    au chargement de la fenetre (ListeTest est une observablecollection)

    et j'ai modifié la classe de test ainsi

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
        abstract public class Test : ITestDiagnosticTool, INotifyPropertyChanged
        {
            #region Attributs
     
            private ObservableCollection<string> _testLog = new ObservableCollection<string>();
            private EtatTest _testResult = EtatTest.Pending;
            public enum EtatTest { True, False, Pending };
     
            #endregion
            #region Proprietes
     
            public EtatTest TestResult
            {
                get { return _testResult; }
                set {
                    RaisePropertyChanged("TestResult");
                    _testResult = value;
                }
            }
     
            public ObservableCollection<string> TestLog
            {
                get { return _testLog; }
                set {
                    RaisePropertyChanged("LogAsString"); 
                    _testLog = value;
                }
            }
     
            public string LogAsString
            {
                get
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (var l in TestLog)
                    {
                        sb.AppendLine(l);
                    }
                    return sb.ToString();
                }
            }
    Mais rien n'y fait :-/

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 756
    Par défaut
    Bon, problème résolu, je ne levais pas l'event en ajoutant un élément dans la ObservableCollection. J'ai donc ajouté une méthode pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void AddLog(string log)
            {
                TestLog.Add(log);
                RaisePropertyChanged("LogAsString");
            }
    (je devrais pas coder en étant fatigué moi ^^)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 756
    Par défaut
    A ce propos, j'ai une question sur un point : Est il possible d'indiquer au ListBox de ne pas afficher les élément vides (on peut sélectionner les traitements à réaliser) ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Par défaut
    Tu créé une propriété de type Visibility qui renvoie Visible si le Count de tes logs est supérieur a 0 et Collapsed sinon et tu Bind la propriété Visibility du TextBlock de ton DataTemplate dessus, attention a notifier le changement de valeur au bon moment. Tu peut aussi le faire avec un Converter. Et au lieux de Binder la propriété du TextBlock il serais plus convenable de le faire dans l'ItemContainerStyle de la ListBox.

+ 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. Bind dynamique sur hashset
    Par bertrand0756 dans le forum Spring
    Réponses: 5
    Dernier message: 31/08/2011, 13h33
  3. WPF Binding sur une listbox
    Par infosam76 dans le forum C#
    Réponses: 4
    Dernier message: 16/06/2011, 22h31
  4. Binding impossible sur une custom ListBox
    Par tucod dans le forum Silverlight
    Réponses: 4
    Dernier message: 23/03/2009, 14h44
  5. [VBA-E] Dim dynamique sur un tableau
    Par Vince69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/12/2002, 13h32

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