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

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

Ответов (10)

Решение

I have tried MVP and it seems to work great with windows forms too. This book has an example of windows forms with MVP pattern (sample payroll application). The application is not that complex but will give you an idea about how to go about creating it.

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

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

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

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

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

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

Не называйте это именем (это фреймворк MVP).

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

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

Простой пример привязки treeview (привязка бедняка). Вы можете добавить любую логику, специфичную для древовидного представления, в 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);
   }
}

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

MVVM для .NET Winforms

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

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

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

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

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

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

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

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

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

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

Как уже было сказано, я всегда работал в шаблоне 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/

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

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

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

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

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

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

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

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

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

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

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

Я могу сослаться на свой собственный проект, в котором я использую шаблон 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

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

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