Проверка ввода в WPF - PullRequest
1 голос
/ 13 июня 2010

Я занимаюсь разработкой приложения в wpf с использованием шаблона проектирования MVVM. У меня есть список, когда элемент спит, а затем открывается диалоговое окно с той же записи в редактируемом режиме. этот диалог связан с выбранным элементом списка. Я применил правило проверки для текстового поля, используя IDataErrorInfo. когда пользователь обновляет запись в диалоговом окне, то при каждом нажатии клавиши выбранная запись в списке также изменяется. Если пользователь нажимает кнопку «Сохранить», я отправляю изменения в базу данных. но если пользователь нажимает кнопку отмены, то я не отправляю изменения в базу данных, но список обновляется текущим обновлением в графическом интерфейсе. когда я обновляю список, снова появляется старое значение. Мое требование - обновлять список только тогда, когда пользователь нажимает кнопку сохранения, но не при каждом нажатии клавиши в диалоговом окне. Сначала я заполняю общий список классами linq to sql, а затем связываю с ним список. Пожалуйста, дайте мне знать, что я должен сделать.

Заранее спасибо

1 Ответ

0 голосов
/ 13 июня 2010

Проблема в том, что вы редактируете один и тот же объект в обеих формах. Вы должны передать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...