Шаблон дизайна пользовательского интерфейса для Windows Forms (например, MVVM для WPF)

160

MVVM чаще всего используется с WPF, потому что он идеально подходит для него. Но как насчет Windows Forms? Существует ли уже установленный и часто используемый шаблон подхода / дизайна, подобный этому, для Windows Forms? Тот, который явно работает с Windows Forms? Есть книга или статья, которая описывает это хорошо? Может быть, MVP или MVC на основе?

bitbonk
источник
смотри также stackoverflow.com/questions/654722/...
Ian Рингроуза
5
это кажется хорошим вопросом. увидеть голоса и звезды ..
Nawfal
13
Как это неконструктивно, когда это именно тот разговор, который я искал? Умеренный, а не диктовать!
САПР bloke
Так что в принципе, MVVM для WinForms возможен. Но большинство людей предпочитают говорить о том, как они использовали MVP / MVC в прошлом, вместо того, чтобы продвигать идею Winforms / MVVM. Или, скорее, они остановились на том, как на самом деле она называется Presenter Model, а не MVVM, и насколько она хороша для WPF.
Х. Авраам Чавес
9
Я всегда разочарован, когда этот тип вопроса закрыт как «неконструктивный», поскольку, как уже упоминалось в другом постере, этот тип обсуждения - именно то, что я искал здесь. Модераторы, пожалуйста, придерживайтесь более либеральной точки зрения и ослабьте кнопку «неконструктивно».
Тим Лонг

Ответы:

94

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

Agile Принципы, Шаблоны и Практики в C # ...

Вы можете получить исходный код в Source Code

РЕДАКТИРОВАТЬ:

Существуют две разновидности схемы MVP (а) пассивный вид и (б) контролирующий контроллер

Для сложных сценариев привязки данных я предпочитаю использовать паттерн Supervising controller. При контроле структуры контроллера ответственность за привязку данных возлагается на представление. Таким образом, для дерева / таблицы данных это должно быть в соответствующих представлениях, только презентатор должен передавать только логику, не зависящую от вида.

Я рекомендую взглянуть на следующую структуру MVP MVC # - Структура MVP

Не используйте имя (это фреймворк MVP).

Простые winforms видео MVP Winforms - MVP

Пример работы с выпадающим списком MVP - DropDownList

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

Ниже приведен фрагмент кода .... не проверено, непосредственно введено от мысли ....

public interface IYourView
{
   void BindTree(Model model);
}

public class YourView : System.Windows.Forms, IYourView
{
   private Presenter presenter;

   public YourView()
   {
      presenter = new YourPresenter(this);
   }

   public override OnLoad()
   {
         presenter.OnLoad();
   }

   public void BindTree(Model model)
   {
       // Binding logic goes here....
   }
}

public class YourPresenter
{
   private IYourView view;

   public YourPresenter(IYourView view)
   { 
       this.view = view;
   }

   public void OnLoad()
   {
       // Get data from service.... or whatever soruce
       Model model = service.GetData(...);
       view.BindTree(model);
   }
}
Раджеш Пиллаи
источник
1
Спасибо, пример в этой книге слишком простой на мой вкус. Как бы я поступил в Winforms и MVP с более сложным отображением данных, таким как TreeView или DataGridView, сколько (какая) логика будет находиться где?
bitbonk
bitbonk - я обновил ответ и проверил, могу ли я получить больше информации.
Раджеш Пиллаи
1
Метод BindTree кажется мне немного ошибочным. Внезапно Вид знает о Модели. Это хорошая вещь? Там должно быть тонны людей, сталкивающихся с такого рода проблемами. Я удивлен, что нет книг об этом. Так как в мире .NET есть книги обо всем.
bitbonk
1
Это не недостаток. Это разновидность паттерна MVP «Supervisory Controller». В Supervisor Controller представление знает о модели (это модель представления). Другой - «Пассивный вид», где вид полностью отделен от модели.
Раджеш Пиллаи
14

Как уже говорилось, я всегда работал в шаблоне MVP при использовании Winforms. Но шаблон дизайна, который вы будете использовать, не означает, что вы будете использовать правильно. Существует множество анти-паттернов, прикрепленных к MVP.

Если вы хотите, чтобы все было хорошо запущено, вы должны использовать инфраструктуру для создания умного клиента. Поэтому я рекомендую использовать этот дизайн и методы: Smart Client Software Factory http://www.codeplex.com/smartclient

Здесь вы обсудите текущие среды интеллектуальных клиентов: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: мне нравится этот пост об антипаттернах MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Надеюсь это поможет

alexl
источник
9

Model-View-ViewModel (MVVM) шаблон является шаблоном. По определению шаблон проектирования показывает общее решение в объектно-ориентированном мире, и это решение может применяться на различных платформах (WPF, WinForms, Java Swing и т. Д.). Я согласен, что MVVM лучше всего использовать с WPF, потому что он использует возможности сильного связывания. Однако Windows Forms также поддерживает привязку данных.

WAF Windows Forms адаптер показывает , как применить MVVM шаблон в приложении Windows Forms.

JBE
источник
3
WAF предназначен для WPF, а не для Windows Forms. Ссылка вводит в заблуждение.
Бентли Дэвис
2
Ссылка не вводит в заблуждение. WAF Windows Forms Adapter поставляется с приложением MVVM, которое реализовано дважды: 1. WinForms; 2. WPF. Оба приложения имеют нижние уровни, которые не зависят от технологии пользовательского интерфейса.
Jbe
5

Я писал о вариациях шаблонов проектирования MVP / MVVM, называемых MVP-VM, которые представляют собой индивидуальное решение для приложений winforms, которые требуют полного охвата тестирования и используют привязку данных в качестве основного механизма для обновления презентации с данными модели.

MVVM для .NET Winforms

MVVM (Model View View Model) представляет аналогичный подход для отделения представления от данных в среде, которая обеспечивает привязку данных (WPF). Поскольку .NET Framework 2.0 уже предлагает расширенную инфраструктуру привязки данных, которая также позволяет привязывать время разработки объектов приложения - объект «Модель представления» вполне может вписаться в среду на основе MVP.

Авиад Эзра
источник
4

Я задал этот же вопрос двум моим техническим сотрудникам: возможен ли MVVM для WindowsForms? Оба дали мне один и тот же ответ: « Ни в коем случае! В WindowsForms отсутствуют богатые привязки WPF и Silverlight (OneTime, OneWay, TwoWay, OnewayToSource), а также отсутствуют преобразователи типов ».

  • Шаблон активатора экрана для WindowsForms - вы можете найти его здесь , портированный с Caliburn.Micro by jagui
  • Rich Bindings и TypeConverters - ферма от Кента Бугаарта, делает это независимо от пользовательского интерфейса
  • Команды - WPF Application Framework (WAF) имеет проект WafWinFormsAdapter, который заботится о некоторых вещах MVVM, а именно о командах

Опять же, мы можем иметь MVVM для WinForms? Да мы можем. У нас есть все кусочки. Мы просто должны склеить их вместе.

Тиаго Фрейтас Леал
источник
4

Я считаю, что MVP является шаблоном, хорошо подходящим для разработки WinForms - о чем частично свидетельствует его использование в CAB - платформе Microsoft для WinForms.

Я использую MVP в WinForms для извлечения кода из View - потому что я не могу протестировать код View. А также для включения кода, который должен быть повторно использован (или дублирован), чтобы оставаться вне представления, где он не может быть передан.

Я могу сослаться на свой собственный проект, где я использую шаблон MVP ExceptionReporter.NET . Хотя я уверен, что я не использую это идеально.

Вы упомянули MVVM, работающий на WPF - я думаю, что причина этого в сильной поддержке привязки данных. Если вы не используете привязку данных в WPF (и это, конечно, не обязательно), вы можете выбрать MVP. Дело в том, что MVP - это хороший выбор для любого клиентского приложения. И, возможно, «лучший» выбор, даже в WPF, если вы планируете делиться кодом между проектами, которые не являются WPF.

Для получения дополнительной информации о ценности использования MVP в WinForms см. Видео-презентацию Boodhoo по использованию MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-Presenter И статья MSDN того же автора по адресу http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

PandaWood
источник
Похоже, что материал Boodhoo относится к WebForms, а не к WinForms. Если позже в видео больше ничего нет ...?
Роджер Липскомб
3

Метод BindTree кажется мне немного ошибочным. Внезапно Вид знает о Модели. Это хорошая вещь? Там должно быть тонны людей, сталкивающихся с такого рода проблемами. Я удивлен, что нет книг об этом. Так как в мире .NET есть книги обо всем.

Они предназначены не для сокрытия модели, а для точного определения взаимодействия между различными уровнями приложений. Вы можете полностью изменить бэкэнд, и пока вы будете передавать модель через Bindtree, ваш пользовательский интерфейс будет продолжать работать.

Теперь класс Model может быть неудачным выбором имени в примере, который дает Раджеш. Это может быть TreeData или RecordsData. Как бы вы это ни определяли, он имеет то, что вам нужно, используя механизм привязки Winforms, чтобы привязать определенный элемент управления к базовым данным.

Лучший сайт для просмотра такого рода материалов находится здесь . Мартин Фаулер собрал множество полезных шаблонов дизайна пользовательского интерфейса и шаблонов корпоративного дизайна.

Опять же, ключом к этому является использование интерфейсов для точного определения того, как каждый уровень взаимодействует друг с другом.

В моем собственном приложении (приложения CAD / CAM, используемые для работы металлорежущих станков) моя структура выглядит следующим образом.

  • Формы, реализующие интерфейсы форм
  • UIDLL с представлениями, реализующими интерфейсы представления, которые взаимодействуют с формами через интерфейс формы. Определенные представления регистрируются в UIViewDLL. Представления выполняют объекты команд, найденные в библиотеках команд, которые взаимодействуют с моделью.
  • Командные библиотеки; списки команд, реализующих ICommand. Команда, которая взаимодействует с представлениями, делает это через интерфейсы, представленные в UIViewDLL.
  • UIViewDLL; предоставляет интерфейсы просмотра, используемые командами.
  • Модель; классы и коллекции, которые составляют основные структуры данных моего приложения. Для меня это такие вещи, как материал, траектории, форма, листы, факелы и т. Д.
  • Утилита; DLL, которая обычно использует служебные классы, используемые моей компанией, которые охватывают различные приложения. Например, сложные математические функции.
РС Конли
источник
3

Вы можете использовать Enterprise Architecture, Patterns и Practices в качестве отправной точки, хотя они немного устарели.

Под Общим руководством находится Архитектура приложений для .NET: Проектирование приложений и сервисов , которая является хорошим введением в способы .NET и многоуровневое N-уровневое приложение.

альтернативный текст http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

Для более формальных «шаблонов» есть шаблоны корпоративных решений с использованием Microsoft .NET . (источник: microsoft.com )альтернативный текст

Назвать несколько,

Евгений Йокота
источник
2

Первое хорошее объяснение шаблонов дизайна пользовательского интерфейса, которое я прочитал, было в блоге Джереми Миллера - Создание вашей собственной CAB . Он описывает общие шаблоны - пассивное представление, MVP и т. Д., А также описывает некоторые способы их реализации в C #.

Джереми
источник
1

Вы можете попробовать MugenMvvmToolkit, который позволяет использовать «чистый MVVM» для WinForms. В связи с тем, что он поддерживает привязки на всех платформах, все встроенные функции привязки, доступные для платформы WPF, доступны на всех платформах (включая WinForms).

Вячеслав Волков
источник