Как применить шаблон MVC к разработке GUI

Похоже, ваш подход к работе с dataGridView немного неправильный. Вы пытаетесь работать со строками сетки данных напрямую, но идея состоит в том, чтобы иметь отдельную коллекцию, подобную List<Product>, и отображать ее через источник привязки.

1. Сначала создайте класс, представляющий ваш продукт, например:

public class Product
{
    public string Title { get; set; }
    public string Asin { get; set; }
}

2. Создайте список продуктов и добавьте их в этот список.

3. Нажмите на dataGridView в конструкторе форм и обратите внимание на кнопку со стрелкой в ​​правом верхнем углу. Нажмите на него и сгенерируйте новый источник данных, выбрав класс Product. DataGridBindingSource появится в нижней части дизайнера форм. Давайте предположим, что его зовут dataGridViewBindingSource.

4. Присвойте свою коллекцию продуктов источнику привязки:

dataGridViewBindingSource.DataSource = products;

Теперь вы можете изменить коллекцию продуктов и отобразить обновленные продукты в сетке, вызвав метод dataGridView.Refresh(). На этом этапе вам следует избавиться от исключения «Индекс вне диапазона», и у вас есть ссылка на коллекцию ваших продуктов, поэтому вам не нужно явно «извлекать» их из строк сетки данных.

5. Вместо получения значений из ComboBox вы можете сначала сохранить параметры в продукте, а затем добавить их в комбинированный список.

8
задан 7 October 2008 в 07:11
поделиться

5 ответов

Если бы я был Вами, то я выставил бы события от интерфейса Вашего представления. Это позволило бы Вам делать контроллер центральным ко всему взаимодействию.

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

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

Это оставило бы Вас с Контроллером, являющимся зависящим от модели и интерфейса представления, при этом представление было бы зависящее от данных только и модели, имеющей зависимости.

Некоторые примеры вышеупомянутых взглядов дизайна могут быть найдены в CAB и Умной Ссылке Фабрики клиентского программного обеспечения На Умный Клиент. Они используют шаблон MVP, но он мог одинаково легко быть применен к шаблону MVC.

6
ответ дан 5 December 2019 в 15:28
поделиться

Вообразите этот GUI:

Единица Zergling представлена пользователю как посторонний значок. Вы видите, что это находится в своей неактивной анимации. Назовите это Представлением.

Игровые движения единица путем нажатия на него и целевое местоположение. Можно заменить плеером AI, если Вы хотите. Назовите это Контроллером.

Диапазон HP и нападения единицы вычисляется каждый игровой кадр, когда единица находится в бою. Можно изменить эти данные для превращения Zergling в единицу диапазона. Назовите это Моделью.

Помните об этой аналогии и расширьте ее для своих проектов MVC.

1
ответ дан 5 December 2019 в 15:28
поделиться

Почти каждой платформой GUI (от MFC до SWT, ко что) уже является базирующийся MVC. На самом деле шаблон MVC был сначала создан Smalltalk-80 и позже первый действительно используемый для разработки GUI.

Проверьте дважды и посмотрите на стандарты и предложенные методы для Вашего предпочтительного инструментария GUI. Иногда MVC не будет хорошим шаблоном для работы с при решении определенной проблемы или работе с конкретным инструментарием.

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

3
ответ дан 5 December 2019 в 15:28
поделиться

Важная вещь для Вас для запоминания, то, что в установке MVC Контроллер должен знать, какое Представление назвать, но Представление не должно знать ничего из Контроллера.

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

Это дает Вам гибкость:

  1. Если Ваш клиент хочет вывод PDF чего-то, для чего Вы только обеспечиваете вывод HTML, можно сойти с рук запись нового Представления PDF, которое назовут от Контроллера с теми же параметрами как РЕЖИМ ПРОСМОТРА HTML.
  2. Если Ваш клиент хочет подобный вывод HTML другого источника данных (говорят), можно сойти с рук кодирование нового Контроллера, который предоставляет другой набор данных тому же старому РЕЖИМУ ПРОСМОТРА HTML, который дает тот же отчет HTML только с другими данными.

Если Вы сохраняете свое Представление отсоединенным от определенных Контроллеров и помещаете знание, о котором Представлении звонить от Вашего Контроллера, Вы хорошо на пути.

1
ответ дан 5 December 2019 в 15:28
поделиться

Ваш контроллер должен определенно связать с событиями, определенными в интерфейсе реализации представления.

Как Вы идете о выполнении, это может быть хитрой частью. Внедрение зависимости? Фабрика представления? Имеет представление, инстанцируют контроллера, который оно хочет? Это действительно зависит от того, как сложный приложение будет.

Для чего-то действительно быстрого и простого я запустил бы с наличия каждой конструкции представления, это - контроллер, и затем посмотрите на другие опции, если это должно было стать больше. Лично я думаю, что полная платформа внедрения зависимости является излишеством для полудюжины форм:]

0
ответ дан 5 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: