Bonjour,
J'ai une ComboBox avec des Items et je souhaiterai binder ces ComboBoxItems dans une ListBox pour n'afficher par exemple que le nom.
Une idée ?
Merci
Version imprimable
Bonjour,
J'ai une ComboBox avec des Items et je souhaiterai binder ces ComboBoxItems dans une ListBox pour n'afficher par exemple que le nom.
Une idée ?
Merci
Salut,
tu as plusieurs possibilités,
personnellement je fais ça (mais c'est pas le plus élégant!)
- un évènement SelectionChanged sur la combobox
- tu définis dans cet évènement l'ItemSource de ta ListBox en fonction du SelectedItem de ta Combo
- au préalable, tu précises pour ta ListBox le DisplayMemberPath avec le nom de la propriété à afficher
Vu que tu es en WPF, autant utiliser le Binding que d'utiliser des solutions Windows Forms. Regardes le billet de blog de David Rei intitulé WPF : Le Binding
Utilise un DataTemplate pour afficher un Textblock qui va contenir le nom de tes éléments.
Ok super ca fonctionne :ccool:
Maintenant comment faire pour rendre les éléments sélectionnable ?
J'ai vu dans ton article :
Code:ListBoxItem tvi = this.tv.ItemContainerGenerator.ContainerFromIndex(3) as ListBoxItem ;
Qui permet de récupérer l'item mais cela ne la sélectionne pas.
Pour la sélection de ton ListBoxItem Tvi par le code, tu dois avoir :
Code:tvi.IsSelected = true;
Essaye ca sur le MouseLeftButtonDown:
Code:
1
2 ListBoxItem tvi = this.tv.ItemContainerGenerator.ContainerFromIndex(3) as ListBoxItem ; tvi.IsSelected = true;
Le MouseLeftButtonDown ne réagit pas lors d'un click sur un ListBoxItem.
Il y a certainement quelque chose que je fais mal.
Constructeur :Code:
1
2
3
4
5
6
7
8
9
10
11
12 <Window.Resources> <DataTemplate x:Key="ListBoxTemplate"> <ListBoxItem> <TextBlock Text="{Binding Name}" /> </ListBoxItem> </DataTemplate> </Window.Resources> <Grid> <ListBox Margin="12,28,0,12" Name="listBoxItems" HorizontalAlignment="Left" Width="228" ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource ListBoxTemplate}" MouseLeftButtonDown="listBoxItems_MouseLeftButtonDown"> </ListBox> </Grid>
Code:
1
2
3
4
5
6
7
8
9
10
11
12 public AddItems(ItemsControl control) { InitializeComponent(); this._control = control; this.listBoxItems.DataContext = _control; } private void listBoxItems_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { ListBoxItem tvi = this.listBoxItems.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem; tvi.IsSelected = true; }
Si je mets ContainerFromIndex(3), rien n'est renvoyé.
Salut,
J'ai pas du tout comprendre. Lorsque tu cliques sur un ListBoxItem, il le sélectionne par défaut, pas besoin de le récupérer et de faire IsSelected à true.
Enfin si tu veux récupérer l'évènement MouseLeftButtonDown sur le ListBoxItem, tu peux faire comme ça :
Code:
1
2
3
4
5
6
7
8 <ListBox Margin="12,28,0,12" Name="listBoxItems" HorizontalAlignment="Left" Width="228" ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource ListBoxTemplate}" > <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <EventSetter Event="MouseLeftButtonDown" Handler="Lbi_MouseLeftButtonDown" /> </Style> </ListBox.ItemContainerStyle> </ListBox.ItemContainerStyle> </ListBox>
Code:
1
2
3
4
5 private void Lbi_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // on peut récupèrer le listBoxItem cliqué de cette manière ListBoxItem lbi = (ListBoxItem)sender; }
En fait depuis que j'ai ajouté un DataTemplate à ma ListBox, elle ne se comporte plus comme tel. Comme, par exemple, le clic sur un ListBoxItem.