Шаблон оформлення інтерфейсу для форм Windows (наприклад, MVVM для WPF)


159

MVVM найчастіше використовується з WPF, оскільки він ідеально підходить для нього. А як щодо Windows Forms? Чи існує усталений і широко використовуваний підхід / модель дизайну, як ця для Windows Forms? Той, який добре працює з Windows Forms? Чи є книга чи стаття, яка добре описує це? Можливо, на базі MVP або MVC?



5
це здається гарним питанням. дивіться голоси та зірки ..
nawfal

13
Як це не конструктивно, коли це саме розмова, яку я шукав? Помірно, а не диктувати!
CAD заблокували

Таким чином, MVVM для WinForms можливий. Але більшість людей вважають за краще говорити про те, як раніше використовували MVP / MVC, а не штовхати ідею Winforms / MVVM вперед. Або вони скоріше зупиняються на тому, як це насправді називається Presenter Model, а не MVVM, і як солодкий MVVM для WPF.
Х. Абрахам Чавес

9
Я завжди розчарований, коли такий тип запитань закритий як "неконструктивний", оскільки, як уже згадувався інший плакат, такий тип дискусії - саме те, що я прийшов сюди шукати. Модератори, будь ласка, погляньте більш ліберально і полегшіть кнопку "не конструктивна".
Тім Лонг

Відповіді:


94

Я спробував MVP, і, здається, він чудово працює і з формами Windows. У цій книзі є приклад форм вікон з малюнком MVP (зразок програми оплати праці). Додаток не такий складний, але дасть вам уявлення про шляхи його створення.

Спритні принципи, зразки та практики в C # ...

Ви можете отримати вихідний код в вихідному коді

Редагувати:

Існує два варіанти схеми MVP (a) Пасивний вигляд та (b) контролер, що контролює

Для складних сценаріїв прив'язки даних я вважаю за краще використовувати схему контролера Supervising. Під час контролю схеми контролера відповідальність за зв'язування даних покладається на погляд. Отже, для перегляду дерев / даних це має бути у відповідних представленнях, лише презентація агностики перегляду повинна перейти до презентатора.

Я рекомендую ознайомитись із наступною структурою 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 - я оновив відповідь і перевіряю, чи можу я отримати більше інформації.
rajesh pillai

1
Метод BindTree здається мені дефектом. Раптом Погляд знає про Модель. Це гарна річ? З такими проблемами повинні зіткнутися тонни папола. Я здивований, що про це не існує жодної книги. Оскільки в світі .NET є книги про все.
бітбонк

1
Це не вада. Це аромат "Наглядового контролера" з MVP. Інший - "Пасивний вигляд", де погляд повністю відокремлений від моделі.
rajesh pillai

14

Як уже було сказано, я завжди працював за MVP-схемою при використанні Winforms. Але модель дизайну, яку ви будете використовувати, не означає, що ви будете правильно використовувати. На MVP додаються вантажі анти-шаблону.

Якщо ви хочете почати все добре, вам доведеться використовувати рамку для створення розумного клієнта. Тож я рекомендую використовувати таку розробку та практику: Фабрика програмного забезпечення Smart Client 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

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

WAF Windows Forms адаптер показує , як застосувати MVVM шаблон в додатку Windows Forms.


3
WAF призначений для WPF, а не для Windows Forms. Посилання вводить в оману.
Бентлі Девіс

2
Посилання не вводить в оману. Адаптер форм WAF Windows поставляється з додатком 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), а також не вистачає TypeConverters ."

  • Шаблон активатора екрана для WindowsForms - ви можете знайти його тут , перенесений від Caliburn.Micro by jagui
  • Багаті Наручники і TypeConverters - Анкерний Кент Boogaart, робить його незалежним чином UI
  • Команди - WPF Application Framework (WAF) має проект WafWinFormsAdapter, який піклується про деякі речі MVVM, а саме про команди.

Знову ж таки, чи можемо ми мати MVVM для WinForms? Так, ми можемо. У нас є всі шматки. Треба просто склеїти їх між собою.


4

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

Я використовую MVP в WinForms для витягу коду з представлення - тому що я не можу перевірити код 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


Здається, що Boodhoo стосується WebForms, а не WinForms. Якщо пізніше у відео більше немає матеріалів?
Роджер Ліпскомб

3

Метод BindTree здається мені дефектом. Раптом Погляд знає про Модель. Це гарна річ? З такими проблемами повинні зіткнутися тонни папола. Я здивований, що про це не існує жодної книги. Оскільки в світі .NET є книги про все.

Ці Дизайн не про приховування моделі, а про точне визначення взаємодії між різними шарами додатків. Ви можете повністю змінити бекенд і до тих пір, поки ви пройдете модель через Bindtree, ваш інтерфейс продовжить працювати.

Тепер клас класу може бути поганим вибором імені на прикладі, який дає Раєш. Це може бути TreeData або RecordsData. Однак ви визначаєте, у ньому є те, що вам потрібно використовувати механізм зв'язування Winforms для прив'язки конкретного контролю до базових даних.

Кращий сайт , щоб знайти для цього виду матеріалу тут . Мартін Фаулер зібрав різноманітні корисні моделі дизайну інтерфейсу та моделі дизайну підприємств.

Знову ж таки ключовим у цьому є використання інтерфейсів для точного визначення взаємодії кожного шару між собою.

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

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

3

Ви можете використовувати архітектуру підприємства, шаблони та практики як вихідну точку, хоча вони трохи датовані.

У розділі Загальні вказівки існує архітектура додатків для .NET: Проектування додатків і служб , що є хорошим введенням у .NET способи та багатошаровий N-рівень.

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

Для отримання більш формальних "шаблонів" існують шаблони корпоративного рішення, що використовують Microsoft .NET . (джерело: microsoft.com )alt текст

Назвати декілька,


2

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


1

Ви можете спробувати MugenMvvmToolkit, який дозволяє використовувати "чистий MVVM" для WinForms. Завдяки тому, що він підтримує прив’язки на всіх платформах, всі вбудовані функції зв’язування, доступні для платформи WPF, доступні на всіх платформах (включаючи WinForms).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.