Рефакторинг кода Form.ShowDialog () в MVP - PullRequest
6 голосов
/ 09 августа 2010

У меня есть WinForm и несколько свойств, которые установлены на нем.
например: Имя, Адрес принимаются в форме.
(в действительности гораздо больше свойств)

Текущийреализация в некоторой степени похожа на

frmName frmView = new  frmName (); //frmName  is WINFORM 
frmView.Name= "ABC"; //any valid string or read this from file
frmView.Address="SomeAddress"; //any valid address or read this from file

if (frmView.ShowDialog() == DialogResult.OK)
{
    //OK CLICK PROCESS and
    // get new values edited by user
     string name = frmView .Name;
     string address = frmView.Address;
     doProcessing(name,address);
}
else{
  //Ignore cancel click..
}

как мне преобразовать это в приложение Winform на основе MVP .
Также необходимо реорганизовать обработку, выполненную на ShowDialog() для докладчика / модели
(точно не знаю, где это сделать)?
Также необходимо избегать написания кода на самой форме. (Пассивное представление)

СпасибоВсе.

1 Ответ

6 голосов
/ 09 августа 2010

Я все еще экспериментирую с разными подходами MVP, но то, как я сейчас это делаю, выглядит так:

frmName frmView = new frmName();

if (frmView.ShowDialog() == DialogResult.OK) {
    presenter.RequestProcessing(frmView.Name, frmView.Address);
} else {
    //Ignore cancel click..
}

Вы говорите, что хотите избежать написания какого-либо кода на самой форме, но для меня это не имеет смысла. В Пассивное представление вы передаете все специфичные для приложения запросы контроллеру или докладчику.

В этом примере представление обрабатывает связанную с представлением логику . Открытие диалогового окна не является пользовательским действием, о котором нужно знать что-либо еще (например, докладчика). Точно так же, как открытие контекстного меню, диалоговое окно является частью того, как этот конкретный вид выбирает предложение этих специфичных для приложения запросов пользователю. Пока пользователь не выполнит запрос и не отправит запрос, докладчику не нужно ничего знать.

В некоторых случаях, когда мне нужно было иметь возможность обрабатывать ошибки в самом диалоговом окне, я передавал объект IPresenter в конструктор диалогового окна. Затем он может сам сделать соответствующий запрос докладчика, например, при нажатии кнопки «ОК», и может показать окно сообщения вместо закрытия в случае ошибки.

Существует множество вариантов MVP, но я надеюсь, что это поможет. Удачи в настройке.

...