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 combobox


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut Binding sur combobox
    Bonjour à tous

    J'ai un petit souci de binding sur combobox.

    Voici ce que je réalise :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <ComboBox Name="CmbImgs" Height="66" Margin="24,172,148,0" VerticalAlignment="Top" Width="233" SelectedIndex="0">
                    <ItemsControl ItemsSource="{Binding ComboItems,Mode=OneWay}"/>
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Bmp}" Width="100" Stretch="Uniform"/>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>

    Code c# : 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
     
    class ListImgScreenViewModel:ViewModel
        {
            DirectoryInfo DirImg = new DirectoryInfo(@"C:\Images");
     
            public List<ImgScreenViewModel> ComboItems
            {
                get
                {
                    List<ImgScreenViewModel> aList = new List<ImgScreenViewModel>();
     
                    foreach (FileInfo aFile in DirImg.GetFiles())
                    {
                        aList.Add(new ImgScreenViewModel(aFile));
                    }
     
                    return aList;
                }
            }
     
            public ListImgScreenViewModel()
            { }
     
            public class ImgScreenViewModel:ViewModel
            {
                FileInfo _File;
     
                public BitmapImage Bmp
                {
                    get
                    {
                        BitmapImage aBmpImg = new BitmapImage();
                        aBmpImg.BeginInit();
                        aBmpImg.UriSource = new Uri(_File.FullName);
                        aBmpImg.EndInit();
     
                        return aBmpImg;
                    }
                }
     
                public ImgScreenViewModel(FileInfo theFile)
                {
                    _File=theFile;
                }
            }
        }

    Malheureusement rien ne s'affiche.
    Au départ je passais une liste d'objet sans template et je me retrouvait avec toutes mes images en un seul bloc.

    Bref il doit manquer un petit truc moi je n'arrive pas à voir quoi.
    Ou bien ma méthode est elle complétement erronée?

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Essaies ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <ComboBox Name="CmbImgs" Height="66" Margin="24,172,148,0" VerticalAlignment="Top" Width="233" SelectedIndex="0" ItemsSource="{Binding ComboItems,Mode=OneWay}" >
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Bmp}" Width="100" Stretch="Uniform"/>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>

    Remarque que j'ai enlevé l'élément ItemsControl et ajoué l'attribut ItemsSource="{Binding ComboItems,Mode=OneWay}" dans l'élément ComboxBox lui même.

    Si cela ne marche pas essaies de mettre un Height à ton élément Image.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Merci ça marche nickel, même si je vois pas pourquoi.

  4. #4
    Membre habitué Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Points : 190
    Points
    190
    Par défaut
    Bonjour,

    Dans ton exemple, tu veux que ta combobox affiche ta liste d'images mais tu as fait quelquechose d'étrange : ta source de données est bindée sur l'ItemsSource d'un ItemsControl (pourquoi pas) mais la façon d'afficher (le datatemplate) est géré par la combobox qui...n'est liée à aucune donnée...

    Cela n'est donc pas anormal que rien ne s'affiche avec ton exemple.

    En espérant que cela t'aide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Là n'est pas la question

    La question c'est de savoir pourquoi avoir défini un ItemsControl dans un ComboBox (illogique je pense alors qu'on s'attend à une liste de type ListItem) ?
    Et aussi pourquoi le compilateur (à la compilation comme à l'exécution) n'a signalé aucune erreur) ?

    Moi aussi je veux comprendre.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Moi ce que je ne vois pas trop c'est la différence entre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Combobox ItemsControl.ItemsSource=...>
       ...
    </Combobo>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Combobox ...>
       <ItemsControl ItemsSource=.../>
       ...
    </Combobo>

  7. #7
    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,

    Dans le premier cas, tu mets ItemsControl.ItemsSource. L'exemple qui t'a été donné n'avait pas ItemsControl.. Définir la propriété ItemsSource, permet de préciser la collection d'item de la ComboBox.

    Le deuxième exemple donne l'effet que tu as décrit dans le premier post, à savoir :
    Citation Envoyé par NejNej
    je me retrouvait avec toutes mes images en un seul bloc.
    Car dans ce deuxième cas de figure, tu as ajouté un seul item à ta ComboBox à savoir un ItemsControl qui lui contient toutes les images.

    Pour rappel, des item peuvent être ajoutés à la ComboBox de cette manière :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        <ComboBox>
          <TextBlock Text="1" />
          <TextBlock Text="2" />
          <TextBlock Text="3" />
          <TextBlock Text="4" />
        </ComboBox>

  8. #8
    Membre habitué Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Points : 190
    Points
    190
    Par défaut
    En fait, ce qui t'a peut-être échappé est que le type Combobox dérive du type ItemsControl (cf ici : http://msdn.microsoft.com/en-us/libr....combobox.aspx)

    A l'aide de l'ItemsSource d'un ItemsControl (donc a fortiori d'une combobox), tu précises une liste d'objets que tu souhaites afficher.
    A l'aide du datatemplate tu précises de quelle façon tu souhaites les afficher.

    Pour ce que tu veux faire, il ne faut donc pas mettre de ItemsControl à l'intérieur de ta combobox.

    Mais mettre un ItemsControl dans un autre ItemsControl n'est pas faux "en général". C'est même la toute la puissance de WPF qui te permet d'imbriquer des composants graphiques comme des légos...(une exemple serait une combobox affichant une liste de combobox)

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

Discussions similaires

  1. Mon style supprime / annule mon binding sur mes combobox
    Par slacky dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 24/12/2011, 00h23
  2. double binding sur combobox >>> possible?
    Par waspy59 dans le forum Windows Presentation Foundation
    Réponses: 16
    Dernier message: 03/11/2009, 23h47
  3. Binding sur une combobox
    Par duaner dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/08/2009, 15h48
  4. [Spring MVC] <spring:bind sur combobox
    Par coyote999 dans le forum Spring Web
    Réponses: 2
    Dernier message: 28/02/2008, 14h32

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