Bonjour,
Je me trouve face à un bug étonnant.
Dans ma vu j'ai une datagrid :
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 <DataGrid Grid.Row="1" Grid.Column="1" Grid.RowSpan="1" Grid.ColumnSpan="1" Margin="5,0,10,0" AutoGenerateColumns="False" AlternatingRowBackground="LightGray" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserAddRows="True" ItemsSource="{Binding DataGridSource}" SelectedItem="{Binding SelectedItem, Converter={StaticResource ResourceKey=ConverterKey}}"> <DataGrid.Columns> <DataGridTextColumn Width="40" Header="IDetape" Binding="{Binding IDEtape}" /> <DataGridTextColumn Width="40" Header="IDrecipe" Binding="{Binding IDRecipe}" /> <DataGridTextColumn Width="40" Header="Etape" Binding="{Binding EtapeOrdre}" /> <DataGridTextColumn Width="*" Header="Description" Binding="{Binding EtapeDescription}" /> </DataGrid.Columns> </DataGrid>
Dans ma Vue-Modèle j'ai défini les propriétés et méthodes suivantes :
Enfin mon Modèle est défini comme tel :
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108 #region <!------------------------ PROPRIETES PARTIE DROITE .XAML --------------------------> private ObservableCollection<RecipeEtape> _dataGridSource; public ObservableCollection<RecipeEtape> DataGridSource { get { return _dataGridSource; } set { _dataGridSource = value; OnPropertyChanged("DataGridSource"); } } private RecipeEtape _selectedItem; public RecipeEtape SelectedItem { get { return _selectedItem; } set { _selectedItem = value; OnPropertyChanged("SelectedItem"); } } #endregion <!------------------------ PROPRIETES PARTIE DROITE .XAML --------------------------> #region <!------------------------ PRIVATE METHOD PARTIE DROITE .XAML --------------------------> private void loadData_DataGrid() { foreach (var item in RecipeEtapeProvider.selectAll(_listViewRecetteSelectedItem.Name)) { _dataGridSource.Add(new RecipeEtape { IDEtape = item.IDEtape, IDRecipe = item.IDRecipe, EtapeOrdre = item.EtapeOrdre, EtapeDescription = item.EtapeDescription, }); } subscribeEvent(); _dataGridSource.CollectionChanged += DataGridSource_CollectionChanged; } private void subscribeEvent() { foreach (RecipeEtape obj in _dataGridSource) { obj.PropertyChanged += onPropertyChanged; } } private void onPropertyChanged(object sender, PropertyChangedEventArgs e) { if (_selectedItem.IDEtape != null) { RecipeEtape obj = new RecipeEtape() { IDEtape = _selectedItem.IDEtape, IDRecipe = _listViewRecetteSelectedItem.Name, EtapeOrdre = _selectedItem.EtapeOrdre, EtapeDescription = _selectedItem.EtapeDescription, }; RecipeEtapeProvider.updateItem(obj); } else { RecipeEtape obj = new RecipeEtape() { // IDEtape = "", Incrément auto fait par DB - TODO : Faire soi-même l'AI IDRecipe = _listViewRecetteSelectedItem.Name, EtapeOrdre = _selectedItem.EtapeOrdre, EtapeDescription = _selectedItem.EtapeDescription, }; //RecipeEtapeProvider.addItem(obj); _selectedItem.IDEtape = (int.Parse(RecipeEtapeProvider.selectLastID()) + 1).ToString(); } } private void DataGridSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { RecipeEtape obj; switch (e.Action) { case NotifyCollectionChangedAction.Add: obj = (RecipeEtape)e.NewItems[0]; if (obj.IDEtape == null) { obj.PropertyChanged += onPropertyChanged; } break; case NotifyCollectionChangedAction.Remove: obj = (RecipeEtape)e.OldItems[0]; if (e.OldItems != null) { obj.PropertyChanged -= onPropertyChanged; deleteItem(e.OldItems.Cast<object>().ToList()); } break; default: break; } } #endregion <!------------------------ PRIVATE METHOD PARTIE DROITE .XAML -------------------------->
Lorsque je mets à jour des données du datagrid, j'arrive bien à mettre à jour ma DB.
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 public class RecipeEtape : ViewModelBase { #region Variable private string _idEtape; private string _idRecipe; private string _etapeOrdre; private string _etapeDescription; #endregion Variable #region Constructor #endregion Constructor #region Properties public string IDEtape { get { return _idEtape; } set { _idEtape = value; OnPropertyChanged("IDEtape"); } } public string IDRecipe { get { return _idRecipe; } set { _idRecipe = value; OnPropertyChanged("IDRecipe"); } } public string EtapeOrdre { get { return _etapeOrdre; } set { _etapeOrdre = value; OnPropertyChanged("EtapeOrdre"); } } public string EtapeDescription { get { return _etapeDescription; } set { _etapeDescription = value; OnPropertyChanged("EtapeDescription"); } } #endregion Properties }
Par contre, lorsque je souhaite ajouter une nouvelle ligne, la fonction "onPropertyChanged" est bien utilisée, puis le script :
est bien exécuté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 RecipeEtape obj = new RecipeEtape() { // IDEtape = "", Incrément auto fait par DB - TODO : Faire soi-même l'AI IDRecipe = _listViewRecetteSelectedItem.Name, EtapeOrdre = _selectedItem.EtapeOrdre, EtapeDescription = _selectedItem.EtapeDescription, };
Cependant, et d'une façon que je n'explique pas ni ne comprends, "_selectedItem.EtapeOrdre" retourne "null" alors que "_selectedItem.EtapeDescription" retourne bien la valeur saisie.
Auriez-vous une idée de ce qui peut clocher ?
Partager