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

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

Ответы [ 10 ]

89 голосов
/ 27 февраля 2009

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

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

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

EDIT:

Существует два варианта паттерна 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);
   }
}
14 голосов
/ 12 марта 2009

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

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

9 голосов
/ 20 сентября 2010

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

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

5 голосов
/ 04 августа 2009

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

MVVM для .NET Winforms

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

4 голосов
/ 27 мая 2012

Я задал этот же вопрос двум моим техническим сотрудникам: возможен ли 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 голосов
/ 14 марта 2009

Я считаю, что 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

3 голосов
/ 12 марта 2009

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

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

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

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

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

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

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

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

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

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

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

Чтобы назвать несколько,

2 голосов
/ 12 марта 2009

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

1 голос
/ 03 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...