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 :

[ListboxItems] Comment récupérer l'index et la propriété bindés ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut [ListboxItems] Récuperer un élément bindé
    Bonjour,


    J'ai créé un style pour mes listboxitem.
    mon listboxitem contient une Image.


    Je voudrais savoir comment m'y prendre pour binder ma collection d'objet au listbox, puis que pour chaque image item il aille récupérer le chemin dans mon objet.


    Merci de me donner une piste



    Cordialement,

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Il faut que tu utilises un DataTemplate plutôt qu'un style. La propriété ItemTemplate de la ListBox permet de définir l'apparence que doit avoir chacun des éléments.

    Ensuite, dans ton code, tu as juste à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListBox.ItemsSource = maCollectionDObject;
    Puis, dans ton DataTemplate, tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Image Source="{Binding ImagePath}" .../>
    Voila de quoi de débrouiller pour commencer

  3. #3
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    merci bien

    Comment dois-je faire dans mon cas pour récuperer l'index du listboxitem, et d acceder à la source de l'image?

    Voici le code de mon listbox.
    Le listbox est bindé à une collection dont une propriété (path) est le chemin d'une image, que j'affiche. Je voudrais savoir comment récuperer cette proriété lorsque l'on clic dessus.
    Quelqu'un peut il 'méclairer?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                    <ListBox SelectionChanged="listBoxFond_SelectionChanged" Style="{DynamicResource ListBoxStyle1}" Margin="42.87,80.024,45.728,0" Name="listBoxFond" Height="51.444" VerticalAlignment="Top" BorderThickness="0" BorderBrush="Transparent" Background="Transparent" Visibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Background="Transparent">
                            <Border CornerRadius="5" BorderBrush="White">
                                <Image Source="{Binding Path=path}" Width="40" Height="40"/>
                            </Border>
                        </StackPanel>                 
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    J'ia trouvé comment récuperer le listboxitem sélectionné.
    Cependant je ne trouve pas comment acceder à la source de mon image.
    Personne ne sait???

  4. #4
    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
    a priori tu cherche l'item et dans la datacontext tu es tout
    par exemple ici tu reccup le listviewitem pour reccuperer son actualheight

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=ActualHeight, Converter={StaticResource ReduceConverter}}"
    cela dit pour ton ca precis si tu recup le SelectedItem de ta listebox
    et tu as l'objet qui se trouve dans le datacontext de ton listboxitem
    (donc a priori la source de ton image)

  5. #5
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par ikeas Voir le message
    a priori tu cherche l'item et dans la datacontext tu es tout
    par exemple ici tu reccup le listviewitem pour reccuperer son actualheight

    Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=ActualHeight, Converter={StaticResource ReduceConverter}}"

    cela dit pour ton ca precis si tu recup le SelectedItem de ta listebox
    et tu as l'objet qui se trouve dans le datacontext de ton listboxitem
    (donc a priori la source de ton image)
    Je ne sais pas comment récuperer l'élément du datacontext justement

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Si tu as le ListBoxItem, utilises VisualTreeHelper pour accéder à l'image et donc à sa source

  7. #7
    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
    en gros tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void listBoxFond_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    // avec selected item tu reccup l'objet
                monObject x = this.listBoxFond.SelectedItem as monObject ;
                //et apres tu prend ce que tu veux
                string source = x.path;
    }
    si tu veux reccup l'image (pas le chemin) directement il faut passer le visualtreehelper
    sinon tu la recharge

    voici un exemple du visualtreehellper

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CheckBox[] cb = new CheckBox[this.Combobox1.Items.Count];
                for (int i = 0; i < this.Combobox1.Items.Count; i++)
                {
                    ComboBoxItem cbi = (ComboBoxItem)(Combobox1.ItemContainerGenerator.ContainerFromIndex(i));
                    cb[i] = FindVisualChild<CheckBox>(cbi) as CheckBox;
                }
    la tu peux simplifier car tu connais l'index de la ligne selectionné
    donc
    ListBoxItem cbi = (ListBoxItem )(malistbox.ItemContainerGenerator.ContainerFromIndex(malistbox.selectedindex));

    puis tu utilise la focntion suivante
    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
     
     private QueryType FindVisualChild<QueryType>(DependencyObject obj)
                where QueryType : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                    if (child != null && child is QueryType)
                        return (QueryType)child;
                    else
                    {
                        QueryType childOfChild = FindVisualChild<QueryType>(child);
                        if (childOfChild != null)
                            return childOfChild;
                    }
                }
                return null;
            }
    en cherchant bien entendu une image

    j'espere que ce code peut t'aider

  8. #8
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Voila comment je récupere mon listboxitem.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void listBoxFond_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                ListBoxItem item = listBoxFond.SelectedItem as ListBoxItem;
     
     
     
            }

    Je ne vois pas comment je dois ensuite utiliser ta méthode

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut, normalement, si tu as rempli ta listBox avec un objet que j'appelle "monObjet" (pour suivre l'exemple d'ikeas) contenant des propriétés avec notamment ta propriété path, tu dois pouvoir accéder à l'objet sélectionné de la manière cité par ikeas qui est donc :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void listBoxFond_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
      // avec selected item tu reccup l'objet
      monObject x = this.listBoxFond.SelectedItem as monObject ;
      //et apres tu prend ce que tu veux
      string source = x.path;
    }

    En résumé il faut effectuer un cast sur le listBoxItem.

    Tu dois pouvoir aussi faire ainsi au passage (je crois) :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    monObject x = sender as monObject;


    nb: la fonction donnée après est une autre façon de faire pour récupérer ton image. (il y a donc deux méthodes de proposée )

  10. #10
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    voila il faut faire comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     monObj item = listBoxFond.SelectedItem as monObj ;

  11. #11
    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
    ben c'est ce que j'avais dit non ?

  12. #12
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par ikeas Voir le message
    ben c'est ce que j'avais dit non ?
    effectivement. j'avais du mal lire ou je sais pas trop quoi.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/08/2008, 10h54
  2. Réponses: 4
    Dernier message: 26/10/2006, 12h57
  3. Réponses: 3
    Dernier message: 24/10/2005, 16h32
  4. Comment récupérer l'index du curseur dans une TStringGrid ?
    Par Sydaze dans le forum Composants VCL
    Réponses: 2
    Dernier message: 26/04/2005, 09h17
  5. Comment récupérer l'index du dernier élément inséré ?
    Par Didier100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 22h41

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