Проблема в том, что вы редактируете один и тот же объект в обеих формах. Вы должны передать SelectedItem в диалоговую форму, но затем повторно запросить базу данных для элемента, который был передан в конструктор. Это делает две вещи: позволяет отменить изменения, когда объект был отредактирован, и предоставляет пользователю самые последние данные из базы данных.
Подумайте об этом следующим образом ... Если список содержит данные, которые были даже несколько минут назад, ваш пользователь будет изменять данные, которые, возможно, уже были изменены другим пользователем, выполняющим ваше приложение.
Как только пользователь сохранит (или удалит) запись в диалоговой форме, вы должны затем обновить список. Обычно я использую следующий метод:
DialogViewModel:
// Constructor
public DialogViewModel(MyObject myObject)
{
// Query the database for the required object
MyObject = (from t in _dc.MyObjects where t.ID == myObject.ID
select t).Take(1).Single();
}
// First define the Saved Event in the Dialog form's ViewModel:
public event EventHandler Saved;
public event EventHandler RequestClose;
// Raise the Saved handler when the user saves the record
// (This will go in the SaveCommand_Executed() method)
EventHandler saved = this.Saved;
if (saved != null)
saved(this, EventArgs.Empty);
ListBox ViewModel
Views.DialogView view = new Views.DialogView();
DialogViewModel vm = new DialogViewModel(SelectedItem); // Pass in the selected item
// Once the Saved event has fired, refresh the
// list of items (ICollectionView, ObservableCollection, etc.)
// that your ListBox is bound to
vm.Saved += (s, e) => RefreshCommand_Executed();
vm.RequestClose += (s, e) => view.Close();
view.DataContext = vm;
view.ShowDialog();