Wzorzec projektowy UI dla formularzy Windows (jak MVVM dla WPF)

MVVM jest najczęściej używany z WPF, ponieważ idealnie do niego pasuje. Ale co z Windows Forms? Czy istnieje ugruntowane i powszechnie stosowane podejście / wzorce projektowe takie jak to również Dla Windows Forms? Taki, który działa wyraźnie dobrze z Windows Forms? Czy istnieje książka lub artykuł, który dobrze to opisuje? Może oparte na MVP lub MVC?

Author: Matt Hamilton, 2009-02-27

10 answers

Próbowałem MVP i wydaje się, że działa również świetnie z formularzami windows. Ta książka zawiera przykładowe formularze windows ze wzorem MVP (przykładowa aplikacja płacowa). Aplikacja nie jest tak złożona, ale da ci pomysł, jak go utworzyć.

Zasady zwinne, wzorce i praktyki w C#...

Możesz pobrać kod źródłowy na Kod Źródłowy

EDIT:

Istnieją dwie odmiany wzorca MVP a) Widok pasywny oraz b) kontroler nadzoru

W przypadku złożonych scenariuszy przetwarzania danych wolę stosować wzorzec kontrolera nadzorującego. W nadzorowaniu wzorca kontrolera odpowiedzialność za przetwarzanie danych spoczywa na widoku. Tak więc, dla treeview / datagrid powinno to znajdować się w odpowiednich widokach, tylko logika widoku agnostycznego powinna zostać przeniesiona do prezentera.

Zalecam przyjrzenie się poniższemu FRAMEWORKOWI MVP MVC# - MVP framework

Nie używaj nazwy (to MVP framework).

Simple winforms MVP video Winforms-MVP

Przykład radzenia sobie z rozwijaną listą MVP-DropDownList

Prosty przykład wiązania drzewa (poor man ' s binding). W bindtree () można dodać dowolną logikę treeview.

Poniżej znajduje się fragment kodu.... nie testowany, bezpośrednio zakodowany z myśli....

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);
   }
}
 87
Author: rajesh pillai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 13:05:50

Jak już wspomniano, zawsze pracowałem we wzorze MVP podczas korzystania z Winforms. Ale wzór projektu, którego użyjesz, nie oznacza, że użyjesz go dobrze. Jest mnóstwo anty-wzór dołączony do MVP.

Jeśli chcesz rozpocząć wszystko w dobry sposób, musisz użyć frameworku do budowania inteligentnego klienta. Dlatego zalecam użycie tego projektu i praktyki: Smart Client Software Factory http://www.codeplex.com/smartclient

Tutaj masz dyskusję o aktualnych strukturach smart client: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: podoba mi się ten post na MVP anty-patterns: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Hope this helps

 13
Author: alexl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-12 04:05:53

Wzorzec Model-View-ViewModel (MVVM) jest wzorcem projektowym. Według definicji wzorzec projektowy pokazuje wspólne rozwiązanie w świecie obiektowym i to rozwiązanie może być stosowane na różnych platformach (WPF, WinForms, Java Swing, itp.). Zgadzam się, że MVVM jest najlepiej używany z WPF, ponieważ wykorzystuje silne możliwości wiązania. Jednak Windows Forms obsługuje również wiązanie danych.

The Adapter okien WAF pokazuje jak zastosować wzorzec MVVM w aplikacji Windows Forms.

 8
Author: jbe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-20 18:06:24

Poniższy post wprowadza odmianę wzorców projektowych MVP/MVVM o nazwie MVP-VM, która jest dostosowanym rozwiązaniem dla aplikacji winforms, które wymagają pełnego pokrycia testowego i wykorzystują powiązanie danych jako główny mechanizm aktualizacji prezentacji za pomocą danych modelu.

MVVM dla. NET Winforms

MVVM (Model View View Model) wprowadza podobne podejście do oddzielenie prezentacji od danych w środowisku, które umożliwia powiązanie danych (WPF). Od. NET framework 2.0 oferuje już zaawansowane Infrastruktura wiązania danych, która również umożliwia wiązanie czasu projektowania obiekty aplikacji - "model widoku" entity może pasować całkiem dobrze w oparciu o MVP środowisko.

 5
Author: Aviad Ezra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-13 05:58:17

Zadałem to samo pytanie dwóm moim współpracownikom z techies: czy MVVM dla WindowsForms jest możliwy? Obaj dali mi dokładnie tę samą odpowiedź: "nie ma mowy! W WindowsForms brakuje bogatych wiązań WPF i Silverlight (OneTime, OneWay, TwoWay, OnewayToSource), a także brakuje Typeconverterów."

  • Wzór aktywatora ekranu dla WindowsForms - można go znaleźć tutaj , przeniesiony z Caliburn.Micro by jagui
  • Rich Bindings and TypeConverters - Truss Kent Boogaart, robi to w sposób niezależny od interfejsu użytkownika]}
  • Commands - WPF Application Framework (WAF) ma projekt WAFWINFORMSADAPTER, który zajmuje się niektórymi rzeczami MVVM, a mianowicie poleceniami

Znowu możemy mieć MVVM dla WinForms? Tak, możemy. Mamy wszystkie kawałki. Musimy je tylko skleić.

 4
Author: Tiago Freitas Leal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-27 00:42:15

Uważam, że MVP jest wzorcem dobrze nadającym się do tworzenia WinForms-o czym częściowo świadczy jego użycie w CAB - frameworku Microsoftu dla WinForms.

Używam MVP w WinForms, aby wyodrębnić kod z widoku - ponieważ nie mogę przetestować kodu widoku. A także, aby włączyć kod, który musi być ponownie użyty (lub zduplikowany), aby pozostać poza widokiem, w którym nie można go udostępnić.

Mogę odnieść się do własnego projektu, w którym używam wzorca MVP ExceptionReporter.NET . choć Jestem pewien, że nie używam go idealnie.

Wspomniałeś o MVVM pracującym dla WPF - myślę, że powodem tego jest silne wsparcie wiązania danych. Jeśli nie używałeś wiązania danych w WPF (a na pewno nie jest to obowiązkowe), możesz wybrać MVP. Chodzi o to, że MVP jest silnym wyborem dla każdej aplikacji po stronie klienta. I prawdopodobnie "lepszy" wybór, nawet w WPF, jeśli planujesz współdzielić Kod między projektami, które nie są WPF.

Więcej dowodów na wartość wykorzystania MVP w WinForms Zobacz prezentację wideo Boodhoo na temat korzystania z MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model-view-presenter I artykuł MSDN tego samego autora na http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

 4
Author: PandaWood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 02:02:07
 3
Author: Eugene Yokota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-11 05:36:15

Metoda BindTree wydaje się trochę dla mnie wadliwa. Nagle Widok zna modelkę. Czy to dobrze coś? Musi być mnóstwo poeple konfrontacji z tego rodzaju problemy. Dziwi mnie, że tam nie ma o tym żadnych książek. Od tamtej pory czy książki o wszystkim w. NET świat.

Nie mają one na celu ukrycia modelu, a raczej precyzyjnego zdefiniowania interakcji między różnymi warstwami aplikacji. Możesz zmienić backend całkowicie i tak długo, jak przekazujesz Model przez Bindtree, Twój interfejs będzie nadal działał.

Teraz model klasy może być złym wyborem nazwy w przykładzie, który daje Rajesh. Może to być TreeData lub RecordsData. Niezależnie od tego, jak go zdefiniujesz, ma to, czego potrzebujesz, używając mechanizmu wiązania Winforms, aby powiązać konkretną kontrolę z bazowymi danymi.

Najlepszą stroną do przeglądania tego rodzaju materiałów jest tutaj . Martin Fowler zebrał wiele użyteczny wzorzec projektowy interfejsu użytkownika i wzorce projektowe przedsiębiorstwa.

Ponownie kluczem do tego jest użycie interfejsów, aby precyzyjnie określić, w jaki sposób każda warstwa oddziałuje ze sobą.

W mojej własnej aplikacji (aplikacje CAD/CAM używane do uruchamiania maszyn do cięcia metalu) moja struktura wygląda tak.

  • formularze implementujące interfejsy formularzy
  • UIDLL z widokami implementującymi widok interfejsy współdziałające z formularzami poprzez interfejs formularza. Na rejestr widoków szczegółowych siebie z UIViewDLL Views wykonuje polecenia znalezione obiekty w bibliotekach poleceń, które współdziałają z modelką.
  • Biblioteki poleceń; listy polecenia implementujące ICommand. Polecenie, które oddziałuje z widoki robią to poprzez interfejsy wystawiony w UIViewDLL.
  • UIViewDLL; wyświetla Interfejsy widoku używane przez komendy.
  • Model; klasy i zbiory, które tworzą podstawowe struktury danych mojego podanie. Dla mnie to są rzeczy jak materiał, cięcie, kształt, arkusze, pochodnie itp.
  • Utility; DLL, który jest powszechnie używany klasy użytkowe używane przez moją firmę to obejmuje różne zastosowania. Na przykład złożonych funkcji matematycznych.
 3
Author: RS Conley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-12 13:46:43

Pierwsze dobre wyjaśnienie wzorców projektowych UI przeczytałem na blogu Jeremy ' ego Millera - budowanie własnej kabiny. Opisuje wspólne wzorce-Widok pasywny, MVP, itp. i rozwiązuje niektóre ze sposobów implementacji ich w C#.

 2
Author: Jeremy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-12 17:42:46

Możesz wypróbować MugenMvvmToolkit, który pozwala na użycie "czystego MVVM" dla WinForms. Ze względu na fakt, że obsługuje wiązania na wszystkich platformach, wszystkie natywne funkcje wiązania dostępne dla platformy WPF dostępne na wszystkich platformach (w tym WinForms).

 1
Author: Vyacheslav Volkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 12:22:15