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 :
- 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
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>
Pour implémenter cette ChildWindow, j'ai suivi l'exemple de l'article [Silverlight] Utiliser le ChildWindow en Silverlight 3 de Julien Dollon
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(); } }
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.
Partager