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 :

Lier une collection d'un objet à une listbox


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Lier une collection d'un objet à une listbox
    Boujour a tous.
    Je débute en WPF et je rencontre un problème avec du binding.
    Si je créé une classe A et que dans le code de mon interface je créé une propriété de type ObservableCollection(Of A) puis que je la 'bind' à une ListBox tous se passe bien,lors d'un ajout la liste se met à jour.
    Par contre, si je garde toujours ma classe A et que je créé une classe B avec une propriété de type ObservableCollection(Of A) et que dans le code de l'interface je declare un objet de de type B puis que je 'bind' la propriété de l'objet à la ListBox, cela ne marche pas.
    La question est donc pourquoi je ne peut pas lier la propriété de mon objet?

    Mon code est en VB mais j'accepte également le C#

    Voici un peu de code pour imager mes dires

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    '****************************Classe A
     
    Public Class A : Implements ComponentModel.INotifyPropertyChanged
        Private sNom As String
     
        Public Property Nom() As String
            Get
                Return sNom
            End Get
            Set(ByVal value As String)
                sNom = value
                RaiseEvent PropertyChanged(Me, New ComponentModel.PropertyChangedEventArgs("Nom"))
            End Set
        End Property
     
        Public Sub New(ByVal i As Integer)
            Me.Nom = "Nom" & i
        End Sub
     
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    End Class
     
    '****************************Classe B
     
    Public Class B : Implements ComponentModel.INotifyPropertyChanged
     
        Private lstc As ObjectModel.ObservableCollection(Of A)
        Public Property Liste() As ObjectModel.ObservableCollection(Of A)
            Get
                Return lstc
            End Get
            Set(ByVal value As ObjectModel.ObservableCollection(Of A))
                lstc = value
                RaiseEvent PropertyChanged(Me, New ComponentModel.PropertyChangedEventArgs("Liste"))
            End Set
        End Property
     
        Private i As Integer = 0
        Public Sub Ajout()
            If Me.lstc Is Nothing Then lstc = New ObjectModel.ObservableCollection(Of A)
            Dim t As New A(i)
            i += 1
            lstc.Add(t)
        End Sub
     
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    End Class
     
    '*****************************Code de l'interface
     
    Class Window1
        Private omonObjet As B
        Public ReadOnly Property MonObjet() As B
            Get
                Return omonObjet
            End Get
        End Property
     
        Public Sub New()
            omonObjet = New B()
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
            omonObjet.Ajout()
        End Sub
     
    End Class
     
    '****************************Code XAML
     
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="Window1"
        Title="Window1" Height="396" Width="432" x:Name="Window1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:WpfApplication8="clr-namespace:WpfApplication8">
    	<Window.Resources>
    		<DataTemplate x:Key="DataTemplate1">
    			<Canvas Width="168" Height="48">
    				<Label Width="80" Height="32" Content="{Binding Path=Nom}" Canvas.Left="8" Canvas.Top="8" Background="#FFF13131"/>
    			</Canvas>
    		</DataTemplate>
    	</Window.Resources>
        <Grid>
            <ListBox Margin="36,16,0,110" x:Name="ListBox1" Width="126" HorizontalAlignment="Left" ItemsSource="{Binding Path=MonObjet:Liste, ElementName=Window1}" ItemTemplate="{DynamicResource DataTemplate1}" />
            <Button Height="23" Margin="192,20,149,0" x:Name="Button1" VerticalAlignment="Top" Content="Button"/>
        </Grid>
    </Window>
    Merci par avance.

  2. #2
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    normalement la collection doit heriter de observablecollection<ton type>
    et n'implemente pas inotifipropertychanged (c'est deja fait indirectement)
    change le code en vb et reessay

    tu peux mettre ton petit projet en pj ca sera plus simple pour comprendre les modifi que tu fais sur les changement de classe (j'ai pas tout compris)
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Voila ci-joint le petit projet.
    Le problème vient peut-être de la façon d'on j'ai lié ma source dans le XAML.

    Merci de prendre du temps pour répondre
    Fichiers attachés Fichiers attachés

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ItemsSource="{Binding Path=MonObjet:Liste, ElementName=Window1}"
    A mon avis, ton pb doit venir de cette syntaxe... Il faut que tu déclares une instance de ta classe B dasn les ressources de ta Window puis que tu l'utilise lors de ton binding.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Comment je fais pour declarer une instance de ma classe dans les ressources?

  6. #6
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    bon effectivement c'est compliqué

    normalement pour que ca marche bien on met les object dans les resource de la fenetre ou on affecte le item source par la suite
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
            Me.ListBox1.ItemsSource = MonObjet.Liste
            Me.ListBox2.ItemsSource = Me.Liste2
        End Sub
    sinon faut mettre l'objet en resource (donc pas besoin de le declarer dans le code)
    comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <Window.Resources>
    		<DataTemplate x:Key="DataTemplate1">
    			<Canvas Width="168" Height="48">
    				<Label Width="80" Height="32" Content="{Binding Path=Nom}" Canvas.Left="8" Canvas.Top="8" Background="#FFF13131"/>
    			</Canvas>
    		</DataTemplate>
            <local:B x:Key="collectionB" />
    	</Window.Resources>
        <Grid>
            <ListBox Margin="14,110,0,16" x:Name="ListBox1" Width="126" 
                     HorizontalAlignment="Left" 
                     ItemsSource="{Binding Source={StaticResource collectionB}}" 
                     ItemTemplate="{DynamicResource DataTemplate1}" />
    et dans ton code tu fais par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button3.Click
            Dim bb As B = Me.Resources("collectionB")
            bb.Liste.Add(New A(i))
        End Sub
    voila dans ton cas ca marche pas car B devrait etre une collection de A
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Le problème, Ikeas, c'est qu'avec ce code l'ajout d'un élément dans la liste se fait dans l'IHM alors que moi l'ajout se fait au sein de l'objet.
    De plus il ne reconnait pas "<local:B" je ne sais pas pourquoi.

    Merci pour votre patience.

  8. #8
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    pour le local faut ajouter
    en haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication8"
        x:Class="Window1"
        Title="Window1"
    mais ca pose aucun probleme que tu fasse ton ajout dedans ou dehors ca change rien
    dans la cas present dans ta classe b tu fais lstc.Add(t)
    si tu herite de observablecollection tu ferra me.Add(t)
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci pour tout.Tout fonctionne à merveille.Depuis le temps que j'essayais de faire marcher ça.
    Encore merci d'avoir passé du temps à me répondre, en espérant que ça pourra servir à d'autre
    Bonne soirée.

  10. #10
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    passe quand meme au C# c'est "plus" mieux
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ha le traditionnel débat VB vs C#.Pour moi c'est du .net.
    Je pense que les deux langages on leurs avantages et inconvenients.
    Je trouve la syntaxe du VB plus lisible et assez proche du 'parler'.Mais c'est vrai qu'il est moins rigoureux.Chaqu'un ses gouts ou ses obligations.
    Tous ce que l'on fait avec l'un peu être fait avec l'autre.

    Bye

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Je me permet de poster à la suite de ce post car j'essai de rajouter une complexité au code précédent.
    En effet, de le code du dessus la classe B heritait de ObservableCollection, ce qui me permettait de la lier la liste à une ListBox.Mais si maintenant j'ai une classe qui possède plusieurs ObservableCollection(of ) et que je veux lier chaque collection à une ListBox différente comment faire?? car la classe ne peu plus hériter de ObservableCollection (qui est typée).
    Mais si c'est vraiment bizard comme demande et qu'il y a d'autre solutions c'est avec plaisir que les prendrai en compte.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    En fait j'ai résolu mon problème .
    Il suffit que je declare autant de ressouces que de liste à lier et que dans le constructeur de ma fenêtre, j'associe chaque liste de mon objet à mes ressources et voila.
    Pour plus d'information je pourrai poster mon petit projet de test pour ceux qui n'auraient pas tout compris .

  14. #14
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    oui vasy voir pour ton projet
    met des commentaires dedans
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Voila le projet.
    Je reste là pour des questions éventulles
    Fichiers attachés Fichiers attachés

  16. #16
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    c'est quoi le bleme sur ton code la ?.
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

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

Discussions similaires

  1. Modifier une collection d'un objet
    Par rad_hass dans le forum Entity Framework
    Réponses: 0
    Dernier message: 07/03/2011, 13h17
  2. Réponses: 2
    Dernier message: 16/03/2009, 14h37
  3. modifier une collection Form2 à partir d'une Form3
    Par vagg123 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/02/2009, 12h30
  4. Réponses: 0
    Dernier message: 11/11/2008, 19h52
  5. [WPF] appliquer un converter a une propriété des éléments d'une collection
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 17
    Dernier message: 23/01/2008, 21h39

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