Проблема событий Winforms MVP Grid

Я пытаюсь реализовать шаблон MVP для WINFORM. Это просто для кнопки и сетки, при нажатии кнопки сетка загружается, и пользователь может вводить значения в сетку.

Для моего события нажатия кнопки у меня есть что-то вроде этого:

_presenter.LoadGrid();

Что просто и понятно.

Мой вопрос в отношении сетки... Я планирую запустить событие щелчка строки.... для включения/отключения последующих полей ввода для определенных столбцов/строк сетки и т. д.

Я понимаю, что ведущий не должен содержать никаких элементов графического интерфейса, а вид (форма) не должен содержать логику?

Итак, чтобы запустить это событие GridRowClick, мне нужно манипулировать сеткой (графический интерфейс) на основе бизнес-правил (логика). Я теряюсь между тем, чтобы позволить ведущему обрабатывать логику этого события щелчка или форму?

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

Любые советы будут высоко оценены.

Ваше здоровье


person Joshscorp    schedule 14.05.2009    source источник


Ответы (3)


Есть (как минимум) два варианта MVP.

  • Шаблон пассивного просмотра
  • Шаблон управляющего контроллера

Пассивный вид, как следует из его названия, рассматривает пользовательский интерфейс как более или менее пассивный интерфейс между пользователем и приложением. Он перемещает как можно больше тестируемого кода в презентатор, оставляя представление для обработки только самых основных обновлений пользовательского интерфейса.

Контролирующий контроллер возлагает на представление немного больше ответственности, позволяя ему обрабатывать синхронизацию данных. Обычно это делается с помощью привязки данных.

В любом случае обработка событий выполняется путем делегирования методу презентатора:

EventHandler()
{
    presenter.HandleEvent();
}

Если обработка события требует внесения изменений в форму, вы предоставляете то, что необходимо обновить, как свойство:

public string PropertyThatNeedsToBeUpdated
{
    get
    {
        return Control.Property;
    }
    set
    {
        Control.Property = value;
    }
}

Для пассивного просмотра сетки являются препятствием. Их сложность затрудняет захват всех возможных событий. С Контролирующим контроллером сетки намного проще, так как вы оставляете синхронизацию данных до элементов управления, привязанных к данным.

Вы должны сделать суждение о том, что больше подходит для вашей ситуации.

person Kenneth Cochran    schedule 15.05.2009

Суть в том, чтобы передать всю эту бизнес-логику в презентатор, где ее можно проверить.

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

Затем презентатор выполняет бизнес-логику и обновляет данные.

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

Как вы говорите, вы должны стремиться минимизировать количество нетривиального кода в своем представлении, и, в частности, в представлении не должно быть никакой бизнес-логики.

ИЗМЕНИТЬ:

Немного полезной общей информации о MVP и других шаблонах представления здесь: http://martinfowler.com/eaaDev/uiArchs.html

person Dave Cluderay    schedule 15.05.2009

Возможно, вы захотите посмотреть четвертую часть серии видеороликов от Polymorphic Podcast. Он использует паттерн контролирующего контроллера и демонстрирует технику работы с сетками данных. На самом деле вся серия была для меня хорошим введением.

http://polymorphicpodcast.com/shows/mv-patterns/

person Keith G    schedule 11.09.2009