DataGrid, problème récupération données
Bonjour,
Je me trouve face à un bug étonnant.
Dans ma vu j'ai une datagrid :
Code:
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 :
Code:
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 --------------------------> |
Enfin mon Modèle est défini comme tel :
Code:
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
} |
Lorsque je mets à jour des données du datagrid, j'arrive bien à mettre à jour ma DB.
Par contre, lorsque je souhaite ajouter une nouvelle ligne, la fonction "onPropertyChanged" est bien utilisée, puis le script :
Code:
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,
}; |
est bien exécuté.
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 ?