Bonjour,
J’ai un problème que je dois exposer. Il s’agit d’un problème de Binding je pense.
Alors ce n’est pas très simple à expliquer. Je vais présenter le code dans un premier temps et ensuite le problème que je rencontre.
XAML :
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 <telerik:RadGridView Grid.Column="0" Grid.RowSpan="2" Margin="2,2,2,2" Name="gv_route" SelectionChanged="gv_route_SelectionChanged" AutoGenerateColumns="False" ShowGroupPanel="false" RowIndicatorVisibility="Collapsed"> <telerik:RadGridView.Resources> <DataTemplate x:Key="chkTemplateACTIVE"> <CheckBox IsChecked="{Binding IsActivated}" Name="chbx_route" Unchecked="chbx_route_Unchecked" Checked="chbx_route_Checked"/> </DataTemplate> <DataTemplate x:Key="lv_btn_image"> <telButton:RadButton Name="btn_visualisation" Height="20" Width="20" Click="btn_visualisation_Click" Background="White" IsEnabled="true"> <Image Source="../../Icone/loupe1.png" Height="10" Width="10" /> </telButton:RadButton> </DataTemplate> </telerik:RadGridView.Resources> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn CellTemplate="{StaticResource chkTemplateACTIVE}" Width="30" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding Name}" Width="200" Header="Tronçon Nom" IsReadOnly="True" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding RunTotalCount}" Width="50" Header="Courses" IsReadOnly="True" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding RunActivatedCount}" Width="90" Header="Courses actives" IsReadOnly="True" /> <telerik:GridViewDataColumn CellTemplate="{StaticResource lv_btn_image}" Width="35" /> </telerik:RadGridView.Columns> </telerik:RadGridView>
Code C# :
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 private void chbx_route_Checked(object sender, RoutedEventArgs e) { Route _selRoute; CheckBox check = e.Source as CheckBox; _selRoute = check.DataContext as Route; //On initialise la topologie de la route. Cette fonction va aussi vérifier les tronc communs avec les routes déjà selectionnées this._stathorControleur.InitTopologyOneRoute(_selRoute); //On initialise les courses réalisées de la route this._stathorControleur.InitRealizedRunsOneRoute(_selRoute); DisplayRoute(); DisplayInterStop(); } private void DisplayRoute() { //Permet laffichage des data dans la GridView via le Binding gv_route.Dispatcher.BeginInvoke((Action)(() =>{ ObservableCollection<Route> _list_route = new ObservableCollection<Route>(); if (this._stathorControleur.StathorDataFilter.LinesActivated.Count != 0){ foreach (StaLine line in this._stathorControleur.StathorDataFilter.LinesActivated){ foreach (Route rte in line.RouteList){ _list_route.Add(rte); } } if (_list_route.Count > 0){ gv_route.ItemsSource = _list_route; } } else { ObservableCollection<Route> tmp = (ObservableCollection<Route>)gv_route.ItemsSource; tmp.Clear(); } }), DispatcherPriority.Background); }
Le contexte :
Si vous regardez bien, j’ai une CheckBox dans ma GridView. Elle est bindé avec « IsActivated » qui est un booléen. Et lorsqu’elle est Cheched ou Unchecked l’évènement « chbx_route_Checked se produit ». Il permet de modifier des paramètres en fonction de la valeur true ou false et d’afficher les données dans une seconde GridView « DisplayInterStop() » ou d’actualiser l’état de la GridView courante « DisplayRoute() ».
Lorsqu’une route est sélectionné (via checkBox), les interStops de cette route sont affichés dans la seconde GridView. Quand je sélectionne une seconde route, une vérification est réalisée afin de voir si elle possède des InterStops en commun avec la première route. Si c’est le cas les 2 routes resterons cochées et la second GridView sera mise à jour avec l'affichage des interStops commun, sinon la second sera décoché automatiquement, seule la premier restera cochée.
Le problème :
Au début lorsque que la GridView est bindé la première fois les booléens sont à false donc aucune case est cochée.
Par contre, lorsque l’utilisateur coche pour la première fois une case, l’évènement « chbx_route_Checked » est appelée et la fonction DisplayRoute() également. Ce qui engendre un nouveau binding sur la GridView en cours car maintenant le booléen de la route sélectionné est à true. Et le binding dans la GridView interprète ca en cochant la case correspondante et du coup en appelant une nouvelle fois l’évènement « chbx_route_Checked » et ainsi de suite. Cela provoque une boucle sans fin.
Il faudrait que l’évènement « chbx_route_Checked » soit appelé uniquement par l’action du check de l’utilisateur et non pas lors du binding.
Comment peut-on résoudre ce problème ?
Je vous remercie d'avance pour votre aide.
Cordialement
Partager