Bonsoir, j'ai trois ComboBox, et un DataGrid, les deux premier ComboBox me sert à filtrer le contenue qui est sur le troisième ComboBox. Tous ces contrôleurs ont un bind respectivement sur des Observablecollection.
D'une autre manière, je veux que quand l'utilisateur choisie un item du premier ou du deuxième ComboBox, selon son choix, je cache les items non concernés du troisièmement ComboBox et du DataGrid.
Voici le code XAML pour un ComboBox.
Le Bind:
Code xaml : 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 <ComboBox Name="monCB_1"....> <ComboBox.ItemsSource> <CompositeCollection> <TextBlock Text="{DynamicResource All}" /> <CollectionContainer x:Name="maCC_1"/> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox> <ComboBox Name="monCB_2"....> <ComboBox.ItemsSource> <CompositeCollection> <TextBlock Text="{DynamicResource All}" /> <CollectionContainer x:Name="maCC_2"/> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox> <ComboBox Name="monCB_3" DisplayMemberPath="Nom" SelectedValue="Id"....> <ComboBox.ItemsSource> <CompositeCollection> <TextBlock Text="{DynamicResource All}" /> <CollectionContainer x:Name="maCC_3"/> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox>
maCC_#.Collection = maListe_#; #: 1,2,3
* Lors de l'affichage il n'y a aucun problème.
Voici ce que j'ai mis dans l’événement monCB_1_SelectionChanged:
Sur le DataGrid j'ai aucun problème mais avec mon monCB_3 j'ai l'exception NullReferenceException.
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 monCB1_SelectionChanged(object sender, SelectionChangedEventArgs e) { foreach(maClass c in maList) // ou monCB.Items ou maCC.Collection { if() // Traitmeent du cas de "All" { ((DataGridRow)MonDG.ItemContainerGenerator.ContainerFromIndex(VehicleTrackingDataDic[v.Id].DataGridIndex)).Visibility = Visibility.Visible; ((ComboboxItem)monCB_3.ItemContainerGenerator.ItemContainerGenerator.ContainerFromItem(c)).Visibility = Visibility.Visible; } else { if() // J'ai une condition qui doit être vérifie { ((DataGridRow)MonDG.ItemContainerGenerator.ContainerFromIndex(VehicleTrackingDataDic[v.Id].DataGridIndex)).Visibility = Visibility.Collapsed; ((ComboboxItem)monCB_3.ItemContainerGenerator.ItemContainerGenerator.ContainerFromItem(c)).Visibility = Visibility.Collapsed; } else { ((DataGridRow)MonDG.ItemContainerGenerator.ContainerFromIndex(VehicleTrackingDataDic[v.Id].DataGridIndex)).Visibility = Visibility.Visible; ((ComboboxItem)monCB_3.ItemContainerGenerator.ItemContainerGenerator.ContainerFromItem(c)).Visibility = Visibility.Visible; } } } }
monCB_3.ItemContainerGenerator.ItemContainerGenerator.ContainerFromItem(c) me retourne null à chaque fois.
Et même si j'utilise ....ContainerFromIndex(0) pour tester, j'ai toujours NullReferenceException, sachant que dans le debugger je vois que ItemContainerGenerator contient des items.
Après avoir passé toute l’après-midi dessus, et testé tout ce que j'ai pu trouver sur le net, comme par exemple mettre le VirtualizingStackPanel.IsVirtualizing="False".... J'ai fini par vous solliciter, espérant que quelqu'un pourra me guider.
Si vous ne m'avez pas bien compris :
- J'aimerai savoir dans quel cas ItemContainerGenerator.ContainerFromItem/Index retourne null ?
- Y-a-t-il un autre moyen d'appliquer un filtre ? Sans utiliser le "Remove".
Merci pour votre attention et bonne soirée.
Partager