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 :

[Débutant] Probleme d'affichage dans une listbox


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut [Débutant] Probleme d'affichage dans une listbox
    Bonjour, voila j'ai un soucis sur une application WPF.

    J'ai un DataContext générer par l'outil.

    J'ai un formulaire où il y a une liste et une groupbox.
    Dans cette groupbox se trouve 2 textbox, une pour le code et l'autre pour la designation.

    Voici le code xaml du formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        <Grid>
            <GroupBox x:Name="gbxDetail" DataContext="{Binding ElementName=lbxServices, Path=SelectedItem}">
                <Canvas Width="552">
                    <TextBlock Margin="204,57,233,0" Text="Code :"/>
                    <TextBlock Margin="204,90,233,90" Text="Désignation :"/>
                    <TextBox Height="20" Margin="0,59,156,0" x:Name="txtCode" Text="{Binding code, Mode=TwoWay}" VerticalAlignment="Top" HorizontalAlignment="Right" Width="71" Canvas.Left="241" Canvas.Top="-5" />
                    <TextBox HorizontalAlignment="Right" Margin="0,92,84,95" Text="{Binding designation, Mode=TwoWay}" x:Name="txtDesignation" Width="143" Height="19.277" Canvas.Left="274" Canvas.Top="-5" />
                    <Button Height="29" HorizontalAlignment="Right" Margin="0,0,122,26" x:Name="cmdEmployes" VerticalAlignment="Bottom" Width="105" Canvas.Left="312" Canvas.Top="143">Employés</Button>
                </Canvas>
            </GroupBox>
            <ListBox x:Name="lbxServices" ItemsSource="{Binding}" HorizontalAlignment="Left" Width="198" />
        </Grid>
    Le code behind :

    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
     
     
    private GesperDbDataContext _db;
     
            public Window1()
            {
                InitializeComponent();
     
                this.Loaded += new RoutedEventHandler(Page1_Loaded);
                this.cmdEmployes.Click += new RoutedEventHandler(cmdEmployes_Click);
            }
     
            void cmdEmployes_Click(object sender, RoutedEventArgs e)
            {
                _db.SubmitChanges();
            }
     
     
            void Page1_Loaded(object sender, RoutedEventArgs e)
            {
                _db = new GesperDbDataContext();
     
                Binding Bind = new Binding();
     
                Bind.Source = _db.service.ToObservableCollection();
     
                lbxServices.SetBinding(DataContextProperty, Bind);    
     
            }
    Donc tout marche bien, sauf une chose, la listbox m'affiche Application.Modele.Service, j'aurai aimé avoir la désignation, donc je me suis dit qu'il suffisait de redéfinir la méthode ToString() dans la class du DataContext, mais le probleme c'est que je ne vois pas du tout comment faire, si je modifie le fichier cs du datacontext, il ne prend plus en compte les classes généré par l'outil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public override string ToString()
    {
               return this.designation;
    }
    Donc si vous avez une idée, peut etre qu'il suffit de spécifier quelque part qu'il nous faut seulement affiché la désignation dans la listbox.

    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    Honteux a moi, suffisait juste de rajouté cette redéfinition de la méthode ToString() dans le designer.....

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Par défaut
    C'est effectivement une solution mais a ta place j'aurai préféré une redéfinition du DataTemplate de ta ListBox.

    Apres dans chaque element tu peux choisir de bind un element de ta classe.

    Par exemple :
    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
     
    <ListBox x:Name="ListBoxPerson"
                     Width="400"
                     SelectionMode="Extended"
                     SelectedIndex="0"
                     ItemsSource="{Binding}">
     
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="5">
     
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
     
                            <Image x:Name="imageElement" 
                                   Height="50" 
                                   Width="75" 
                                   Grid.Column="0" 
                                   Source="{Binding Path=Picture}"></Image>
     
                            <TextBlock x:Name="nameElement" 
                                       Grid.Column="1" 
                                       FontWeight="Bold" 
                                       VerticalAlignment="Center"
                                       Width="200"
                                       Margin="10 0 0 0" 
                                       Text="{Binding Path=Name}"></TextBlock>
     
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    Et cote C# :
    La classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Person
    {
    public string Name {get; set;}
    public BitmapImage Picture {get; set;}
    }
    Le binding:
    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
     
    public partial class Window1 : Window
        {
            private ObservableCollection<Person> mPerson;
     
            public Window1()
            {
                InitializeComponent();
     
                ListBoxPerson.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Ascending));
     
                mPerson = monProvider.LoadPerson();
                ListBoxPerson.DataContext = mPerson;
     
            }
    }
    Je trouve ca plus propre et ca ouvre de nombreuse perspective cote design de ta ListBox.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Effectivement, l'utilisation d'un DataTemplate permet plus de souplesse et plus de scénarios

  5. #5
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Hello all,

    Dans le cas ou tu dois afficher simplement une propriété String de ton élément bindé, le plus simple reste d'utiliser la propriété DisplayMemberPath de ta ListBox. Dans ton cas il faut l'utiliser en lui donnant le nom de la propriété à utiliser pour l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DisplayMemberPath="designation"
    .

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

Discussions similaires

  1. Probleme d'affichage dans une page jsp
    Par mora092 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 11/01/2010, 22h19
  2. Problème d'affichage dans une listbox
    Par swap_nibble dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 25/01/2008, 17h29
  3. Problème d'affichage d'une listbox
    Par anto84 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 14/07/2007, 13h37
  4. Affichage dans une listbox
    Par egg3774 dans le forum IHM
    Réponses: 4
    Dernier message: 13/06/2007, 18h15
  5. [Débutant] regroupement d'éléments dans une listBox
    Par fast&furious dans le forum Access
    Réponses: 2
    Dernier message: 15/10/2005, 15h05

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