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 :

Problème de Binding (je pense)


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 44
    Par défaut Problème de Binding (je pense)
    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 l’affichage 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

  2. #2
    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
    Par défaut
    Salut,

    Citation Envoyé par skyline86
    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 ?
    Peut-être que ne pas affecter le Binding ferait l'affaire, ainsi tout se passerait sur l'événement Checked/UnChecked.

    Sinon le binding dispose d'une propriété UpdateSourceTrigger. Tu peux très bien passer sa valeur à Explicit si c'est ton besoin.

Discussions similaires

  1. Probléme avec Bind
    Par rach20032 dans le forum Réseau
    Réponses: 2
    Dernier message: 06/07/2007, 11h36
  2. [Netbeans 6M9 JDk6.1 Matisse] problème de binding
    Par tralloc dans le forum NetBeans
    Réponses: 14
    Dernier message: 21/06/2007, 13h32
  3. problème de bindings avec DropDownList
    Par Vlatiska dans le forum ASP.NET
    Réponses: 14
    Dernier message: 17/03/2007, 14h04
  4. [C#][MySQL 5.x]Problème de Binding
    Par Oufti dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/05/2006, 23h44
  5. Problème de jointure.. je pense.
    Par FMaz dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 19/12/2005, 21h36

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