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

Silverlight Discussion :

ChildWindow bloque les checkbox du Datagrid


Sujet :

Silverlight

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut ChildWindow bloque les checkbox du Datagrid
    Bonjour,

    Je travaille avec Visual Studio 2008 et Silverlight 3.
    J'ai un Datagrid personnalisé qui comporte plusieurs colonnes : des champs textes basiques, des combobox, des checkbox et des boutons (d'enregistrement).

    Pour désactiver certaines cellules du datagrid je binde les propriétés IsEnabled ou IsReadonly grâce aux propriétés d'une classe "Apparence".

    Et lorsque l'on clique sur un bouton d'enregistrement, j'affiche une ChildWindow si un champ de la ligne est vide.

    - Extrait du XAML du datagrid :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
                        <data:DataGridTemplateColumn Header="Libellé" Width="100">
                            <data:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Libelle, Mode=TwoWay}" VerticalAlignment="Center" />
                                </DataTemplate>
                            </data:DataGridTemplateColumn.CellTemplate>
                            <data:DataGridTemplateColumn.CellEditingTemplate>
                                        <DataTemplate>
                                            <TextBox Name="TeB_Libelle" Text="{Binding Libelle, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"  
                                                     BorderThickness="0"  MaxLength="50" 
                                                    Width ="100" Background="#FFD0E4C3" VerticalAlignment="Center"/>
                                </DataTemplate>
                            </data:DataGridTemplateColumn.CellEditingTemplate>
                        </data:DataGridTemplateColumn>
     
                        <data:DataGridTemplateColumn Header="Négatif" Width="30">
                           <data:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                     <Border Background="{Binding Apparence.NegatifBackColor, Mode=TwoWay}">
                                        <CheckBox x:Name="ChB_Negatif" 
                                                  IsChecked="{Binding Negatif, Mode=TwoWay}" 
                                                  HorizontalAlignment="Center" VerticalAlignment="Center" 
                                                  Click="ChB_Negatif_Click" 
                                                  IsEnabled="{Binding Apparence.NegatifIsEnabled, Mode=TwoWay}" />
                                    </Border>
                                </DataTemplate>
                            </data:DataGridTemplateColumn.CellTemplate>
                        </data:DataGridTemplateColumn>
     
                        <data:DataGridTemplateColumn Header="Autres" Width="30">
                            <data:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Border Background="{Binding Apparence.AutresBackColor, Mode=TwoWay}" >
                                        <CheckBox x:Name="ChB_Autres_Tiers" 
                                                  IsChecked="{Binding Apparence.AutresIsChecked, Mode=TwoWay}" 
                                                  HorizontalAlignment="Center" VerticalAlignment="Center" 
                                                  Click="ChB_Autres_Click" 
                                                  IsEnabled="{Binding Apparence.AutresIsEnabled, Mode=TwoWay}" />
                                    </Border>
                                </DataTemplate>
                            </data:DataGridTemplateColumn.CellTemplate>
                        </data:DataGridTemplateColumn>
     
    		<data:DataGridTemplateColumn Header="Enregistrer" Width="65">
                          <data:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel x:Name="Enregistrer" Orientation="Horizontal">
                                        <Button x:Name="Bu_Enregistrer" 
                                                VerticalAlignment="Center" HorizontalAlignment="Center" 
                                                Width="27" Click="Bu_Enregistrer_Click" 
                                                IsEnabled="{Binding Apparence.EnregistrerIsEnabled, Mode=TwoWay}">
                                            <Button.Content>
                                                <Image Name="Im_Enregistrer"  VerticalAlignment="Center" HorizontalAlignment="Center" 
                                                    Source="Resources/Images/Enregistrer.png" Width="16" Height="16" Stretch="Uniform">
                                                </Image>
                                            </Button.Content>
                                        </Button>
                                    </StackPanel>
                                </DataTemplate>
    	             </data:DataGridTemplateColumn.CellTemplate>
    		</data:DataGridTemplateColumn>
    - Extrait du 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
    private void Bu_Enregistrer_Click(object sender, RoutedEventArgs e)
    {
    	string lErreur = string.Empty;
     
    	// Récupération de la ligne courante
      	Ligne lLigne = (Ligne)((Button)sender).DataContext;
     
    	// Controle de saisie de la ligne courante
           	lErreur += Controle_Saisie(lLigne);
     
    	// Si erreur de saisie
    	if (lErreur != string.Empty)
    	{
    		// Définition du titre du childwindow                
                    lTitre = "Erreur saisie";
     
                    // Création et ouverture d'une nouvelle fenêtre d'erreur
                    ChildWindow lFenetreErreur = new ChildWindow (lTitre, lErreur);
                    lFenetreErreur.Show();
    	}
    	else
    	{
    		// Enregistrement
    		Enregistrer();
    	}
    }
    Pour implémenter cette ChildWindow, j'ai suivi l'exemple de l'article [Silverlight] Utiliser le ChildWindow en Silverlight 3 de Julien Dollon

    La ChildWindow s'affiche bien. Les données de son parent sont inaccessibles tant qu'elle est ouverte.

    Lorsque ChildWindow est fermée, les checkbox du datagrid conservent leurs valeurs (cochées ou non) mais restent désactivées et il est impossible de les sélectionner.

    Auriez-vous une idée de solution ?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par exopartners Voir le message
    Lorsque ChildWindow est fermée, les checkbox du datagrid conservent leurs valeurs (cochées ou non) mais restent désactivées et il est impossible de les sélectionner.
    Ca ne vient pas de la valeur de ta classe "Apparence" qui désactive justement les CheckBox ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    C'est ce que je me suis demandé.

    Mais si le problème vient de la classe "Apparence", je ne comprends pas pourquoi ça n'impacte que les propriétés de ces 2 checkbox.

    Ci-dessous un extrait des setters de la classe "Apparence" :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
            /// <summary>
            /// Propriété NegatifIsEnabled : permet de déterminer si le champ Negatif doit être activé ou non
            /// </summary>
            public bool NegatifIsEnabled
            {
                get { return this.c_negatif_is_enabled; }
                set
                {
                    this.c_negatif_is_enabled = value;
                    NotifyPropertyChanged("NegatifIsEnabled");
                }
            }
     
            /// <summary>
            /// Propriété AutresIsEnabled: permet de déterminer si le champ Autres doit être activé ou non
            /// </summary>
            public bool AutresIsEnabled
            {
                get { return this.c_autres_is_enabled; }
                set
                {
                    this.c_autres_is_enabled = value;
                    NotifyPropertyChanged("AutresIsEnabled");
                }
            }
     
            /// <summary>
            /// Propriété AbregeCompteIsReadOnly : permet de déterminer si le champ Abregé doit être en 
            /// lecture seule
            /// </summary>
            public bool AbregeCompteIsReadOnly
            {
                get { return this.c_abrege_is_readonly; }
                set
                {
                    this.c_abrege_is_readonly = value;
                    NotifyPropertyChanged("AbregeIsReadOnly");
                }
            }
     
            /// <summary>
            /// Propriété FormatQuestionIsEnabled : permet de déterminer si le champ Format de question doit être activé ou non
            /// </summary>
            public bool FormatQuestionIsEnabled
            {
                get { return this.c_format_question_is_enabled; }
                set
                {
                    this.c_format_question_is_enabled = value;
                    NotifyPropertyChanged("FormatQuestionIsEnabled");
                }
            }
     
            /// <summary>
            /// Propriété Question1IsReadOnly : permet de déterminer si le champ Question 1 doit être en 
            /// lecture seule
            /// </summary>
            public bool Question1IsReadOnly
            {
                get { return this.c_question1_is_readonly; }
                set
                {
                    this.c_question1_is_readonly = value;
                    NotifyPropertyChanged("Question1IsReadOnly");
                }
            }
     
            /// <summary>
            /// Propriété Question2IsReadOnly : permet de déterminer si le champ Question 2 doit être en 
            /// lecture seule
            /// </summary>
            public bool Question2IsReadOnly
            {
                get { return this.c_question2_is_readonly; }
                set
                {
                    this.c_question2_is_readonly = value;
                    NotifyPropertyChanged("Question2IsReadOnly");
                }
            }
     
            /// <summary>
            /// Propriété EnregistrerIsEnabled : permet de déterminer si le bouton Enregistrer doit être activé ou non 
            /// </summary>
            public bool EnregistrerIsEnabled
            {
                get { return this.c_enregistrer_is_enabled; }
                set
                {
                    this.c_enregistrer_is_enabled = value;
                    NotifyPropertyChanged("EnregistrerIsEnabled");
                }
            }
    Les autres setters de la classe concernent des colonnes de texte, de combobox ou de boutons et ne posent aucun problème.

    Question peut-être un peu présomptueuse de ma part mais y'aurait-il un bug entre Childwindow et les colonnes de checkbox dans un datagrid ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    J'ai créé un projet de test allégé pour illustrer mon problème si quelqu'un est intéressé (voir pièce jointe).

    On observe bien que les colonnes de checkbox pour lesquelles IsEnabled est bindée avec une propriété ne sont pas ré-activées après le passage de ChildWindow.
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ah ben oui il semble y avoir un problème.

    J'ai un peu mieux isoler et le problème vient du fait que le ChildWindow désactive les contrôles du RootVisual lorsqu'on l'affiche.

    Le problème peut-être reproduit dans le clic du bouton en remplacant l'affichage de la ChildWindow par un petit code du genre

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (App.Current.RootVisual as Control).IsEnabled = false;
     
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(2);
    timer.Start();
    timer.Tick += (o, e2) =>
    {
        (App.Current.RootVisual as Control).IsEnabled = true;
        timer.Stop();
    };

    Mieux encore on peut même enlever le DataGrid du projet test et garder seulement un Button.

    En fait le problème vient du Mode TwoWay. Quand on désactive le RootVisual, ça mets la propriété IsEnabled du bouton à false, et à cause du TwoWay, ça met également la propriété sur laquelle il est bindé à false. Le problème est lorsque le VisualRoot est réactivé ben la sauce inverse n'est pas effectuée...

    La solution est donc d'enlever le mode TwoWay du binding (qui ne sert pas par ailleurs).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    J'ai un peu mieux isoler et le problème vient du fait que le ChildWindow désactive les contrôles du RootVisual lorsqu'on l'affiche.
    Oui j'en étais parvenu à la même conclusion hier soir.

    La solution est donc d'enlever le mode TwoWay du binding (qui ne sert pas par ailleurs).
    A vrai dire j'utilisais le mode TwoWay du binding car j'ai besoin de faire varier l'accessibilité des cellules dans certaines situations (valeurs d'autres cellules etc.).
    Corrige moi si je me trompe mais si j'enlève le mode TwoWay je ne pourrais plus faire cela non ?

  7. #7
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Bonjour,

    OneWay -> de la data vers le controle
    TwoWay -> de la data vers le controle + du controle vers le data

    donc tes modifications seront prises en compte en OneWay vu que IsEnabled ne peut être fixé par l'utilisateur de l'interface.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Yes, merci pour le rappel !
    Effectivement le mode OneWay est plus adapté à ma situation et résout bien le problème.
    Nickel, merci Skyounet et Samoteph !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/09/2006, 14h24
  2. Pb avec les checkbox: tout sélectionner,récupération valeurs
    Par bubble_gum dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/10/2004, 17h42
  3. Réponses: 3
    Dernier message: 13/10/2004, 10h43
  4. [VB.NET] Problème checkBox et datagrid
    Par jagdjg dans le forum ASP.NET
    Réponses: 5
    Dernier message: 23/04/2004, 08h53

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