похоже, проблема в том, что при валидации DataGrid отменяет последнее изменение. меня спасло следующее:
dataGrid.EndEdit (null, 0, false);
dataGrid.CurrentRowIndex = 0;
//и только после этого - сохранение
похоже на шаманство, но я ничего лучше не придумал.
поробуй еще покопать CurrencyManager.EndCurrentEdit ()