UI Design Pattern для Windows Forms (например, MVVM для WPF)

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

Ответ 1

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

Agile Principles, Patterns и Practices в С#...

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

EDIT:

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

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

Я рекомендую взглянуть на следующую структуру MVP MVС# - 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);
   }
}

Ответ 2

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

Если вы хотите начать все правильно, вы должны использовать фреймворк для создания интеллектуального клиента. Поэтому я рекомендую использовать этот дизайн и методы: Программное обеспечение Smart Client 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/

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

Ответ 4

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

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

Ответ 5

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

MVVM для .NET Winforms

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

Ответ 6

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

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

Как доказательство эффективности MVP в WinForms, я буду ссылаться на свой собственный проект. Я работаю над проектом ExceptionReporter (http://www.codeplex.com/ExceptionReporter), где мне действительно нужно повторно использовать код между WPF и WinForms "версия" программного обеспечения. Следовательно, я использую MVP для обеих технологий, что позволяет мне использовать один и тот же Presenter между обеими сборками. И избегайте дублирования этого кода.

Вы упомянули 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

Ответ 7

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

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

alt text http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

Для более формальных "шаблонов" существует Шаблоны решений для предприятий с помощью Microsoft.NET. alt text http://i.msdn.microsoft.com/ms998492.Chp_02OrganizingPatterns_Fig06%28en-us%2CMSDN.10%29.gif

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

Ответ 8

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

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

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

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

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

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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