Wzorzec projektowania interfejsu użytkownika dla Windows Forms (jak MVVM dla WPF)

159

MVVM jest najczęściej używany z WPF, ponieważ doskonale się do niego nadaje. Ale co z Windows Forms? Czy istnieje ustalony i powszechnie używany wzorzec podejścia / projektowania, taki jak ten dla Windows Forms? Taki, który działa wyraźnie dobrze z Windows Forms? Czy jest książka lub artykuł, który dobrze to opisuje? Może oparty na MVP lub MVC?

bitbonk
źródło
zobacz także stackoverflow.com/questions/654722/…
Ian Ringrose
5
wydaje się, że to dobre pytanie. zobacz głosy i gwiazdy ..
nawfal
13
Dlaczego nie jest to konstruktywne, skoro właśnie takiej rozmowy szukałem? Umiarkowany, nie dyktuj!
Facet z CAD
Więc w zasadzie możliwe jest MVVM dla WinForms. Ale większość ludzi wolałaby raczej porozmawiać o tym, w jaki sposób korzystali z MVP / MVC w przeszłości, zamiast popychać pomysł Winforms / MVVM do przodu. Albo raczej zastanawiają się, jak to naprawdę nazywa się Presenter Model, a nie MVVM i jak słodki jest MVVM dla WPF.
H. Abraham Chavez
9
Zawsze jestem rozczarowany, gdy tego typu pytanie jest zamykane jako „nie konstruktywne”, ponieważ, jak już wspomniał inny plakat, tego typu dyskusja jest dokładnie tym, czego tu szukałem. Moderatorzy, proszę przyjąć bardziej liberalny pogląd i zwolnić przycisk „nie konstruktywny”.
Tim Long,

Odpowiedzi:

94

Wypróbowałem MVP i wydaje się, że działa świetnie również z formularzami Windows. Ta książka zawiera przykład formularzy okienkowych ze wzorem MVP (przykładowa aplikacja płacowa). Aplikacja nie jest tak skomplikowana, ale daje wyobrażenie o tym, jak ją stworzyć.

Zwinne zasady, wzorce i praktyki w języku C # ...

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

EDYTOWAĆ:

Istnieją dwie odmiany wzorca MVP (a) Widok pasywny i (b) Kontroler nadzorujący

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

Polecam przyjrzenie się poniższej strukturze MVP MVC # - Framework MVP

Nie używaj nazwy (to framework MVP).

Prosty plik wideo WinForm MVP Winforms - MVP

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

Prosty przykład wiązania drzewa (wiązanie dla biednych). Możesz dodać dowolną logikę specyficzną dla drzewa w BindTree ().

Poniżej znajduje się fragment kodu… nie przetestowany, wpisany bezpośrednio 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);
   }
}
rajesh pillai
źródło
1
Dzięki, przykład z tej książki jest trochę za prosty jak na mój gust. W jaki sposób powinienem postępować w Winforms i MVP z bardziej złożonym wyświetlaniem danych, takim jak TreeView lub DataGridView, ile (jaka) logika będzie znajdować się gdzie?
bitbonk
bitbonk - zaktualizowałem odpowiedź i sprawdzę, czy mogę uzyskać więcej informacji.
rajesh pillai
1
Metoda BindTree wydaje mi się trochę wadliwa. Nagle Widok wie o Modelu. Czy to dobrze? Z tego rodzaju problemami musi borykać się mnóstwo ludzi. Dziwię się, że nie ma o tym żadnych książek. Ponieważ są książki o wszystkim w świecie .NET.
bitbonk
1
To nie jest wada. To jest odmiana wzorca MVP „Kontroler nadzoru”. W Kontrolerze nadzoru widok jest świadomy modelu (jest to model prezentacji). Drugi to „Widok pasywny”, w którym widok jest całkowicie oddzielony od modelu.
rajesh pillai
14

Jak już powiedziałem, zawsze pracowałem według wzorca MVP podczas korzystania z Winforms. Ale wzorzec projektowy, którego użyjesz, nie oznacza, że ​​użyjesz dobrze. Jest mnóstwo anty-wzoru dołączonego do MVP.

Jeśli chcesz rozpocząć wszystko w dobry sposób, musisz użyć frameworka do zbudowania inteligentnego klienta. Dlatego zalecę korzystanie z tego projektu i praktyk: Smart Client Software Factory http://www.codeplex.com/smartclient

Masz tutaj dyskusję na temat obecnych struktur klienta inteligentnego: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: Podoba mi się ten post o anty-wzorcach MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Mam nadzieję że to pomoże

alexl
źródło
9

Model-View-ViewModel (MVVM) Wzór jest wzorzec projektowy. Z definicji wzorzec projektowy przedstawia typowe rozwiązanie w świecie zorientowanym obiektowo 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ż powiązanie danych.

WAF Windows Forms Adapter pokazuje, jak zastosować Wzorzec MVVM w aplikacji Windows Forms.

jbe
źródło
3
WAF jest przeznaczony dla WPF, a nie Windows Forms. Link wprowadza w błąd.
Bentley Davis,
2
Link nie wprowadza w błąd. WAF Windows Forms Adapter jest dostarczany z aplikacją MVVM, która jest implementowana dwukrotnie: 1. WinForms; 2. WPF. Obie aplikacje współdzielą niższe warstwy, które są niezależne od technologii interfejsu użytkownika.
jbe
5

Pisałem o odmianie wzorców projektowych MVP / MVVM zwanych MVP-VM, które jest dostosowanym rozwiązaniem dla aplikacji winForm, które wymagają pełnego zakresu testowania i używają wiązania danych jako głównego mechanizmu aktualizowania prezentacji danymi modelu.

MVVM dla .NET Winforms

MVVM (Model View View Model) wprowadza podobne podejście do oddzielania prezentacji od danych w środowisku, które umożliwia powiązanie danych (WPF). Ponieważ .NET framework 2.0 oferuje już zaawansowaną infrastrukturę powiązań danych, która umożliwia również wiązanie obiektów aplikacji w czasie projektowania - jednostka „View Model” może całkiem dobrze pasować do środowiska opartego na MVP.

Aviad Ezra
źródło
4

Zadałem to samo pytanie dwóm moim współpracownikom technicznym: czy MVVM dla WindowsForms jest możliwy? Oba dały mi dokładnie taką samą odpowiedź: „ Nie ma mowy! W WindowsForms brakuje bogatych powiązań WPF i Silverlight (OneTime, OneWay, TwoWay, OnewayToSource), a także brakuje TypeConverters ”.

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

Czy możemy mieć MVVM dla WinForms? Tak możemy. Mamy wszystkie części. Musimy je tylko skleić.

Tiago Freitas Leal
źródło
4

Uważam, że MVP jest wzorcem dobrze dopasowanym do rozwoju WinForm - o czym częściowo świadczy jego użycie w CAB - frameworku Microsoft 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 zostać ponownie użyty (lub jest zduplikowany), aby pozostać poza widokiem, w którym nie można go udostępnić.

Mogę odwołać się do własnego projektu, w którym używam wzorca MVP ExceptionReporter.NET . Chociaż jestem pewien, że nie używam go idealnie.

Wspomniałeś o MVVM pracującym dla WPF - myślę, że powodem tego jest silna obsługa powiązań danych. Jeśli nie korzystałeś z wiązania danych w WPF (i na pewno nie jest to obowiązkowe), możesz wybrać MVP. Chodzi o to, że MVP jest dobrym wyborem dla każdej aplikacji po stronie klienta. I prawdopodobnie „lepszy” wybór, nawet w WPF, jeśli planujesz udostępniać kod między projektami, które nie są WPF.

Aby uzyskać więcej dowodów na wartość korzystania z 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 Oraz artykuł w MSDN tego samego autora pod adresem http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

PandaWood
źródło
Wydaje się, że materiały Boodhoo dotyczą WebForms, a nie WinForms. Chyba że w dalszej części wideo jest więcej rzeczy ...?
Roger Lipscombe,
3

Metoda BindTree wydaje mi się trochę wadliwa. Nagle Widok wie o Modelu. Czy to dobrze? Z tego rodzaju problemami musi borykać się mnóstwo ludzi. Dziwię się, że nie ma o tym żadnych książek. Ponieważ są książki o wszystkim w świecie .NET.

Te projekty nie polegają na ukrywaniu modelu, a raczej na precyzyjnym definiowaniu interakcji między różnymi warstwami aplikacji. Możesz całkowicie zmienić backend i tak długo, jak przekażesz Model przez Bindtree, Twój interfejs użytkownika będzie nadal działał.

Teraz klasa Model może być kiepskim wyborem nazwy w przykładzie, który podaje Rajesh. Może to być TreeData lub RecordsData. Jakkolwiek to zdefiniujesz, ma to, czego potrzebujesz, aby użyć mechanizmu wiązania Winforms do powiązania określonej kontrolki z danymi źródłowymi.

Najlepsza witryna do przeglądania tego rodzaju materiałów jest tutaj . Martin Fowler zebrał wiele przydatnych wzorców projektowania interfejsu użytkownika i wzorców projektowych dla przedsiębiorstw.

Ponownie, kluczem do tego jest użycie interfejsów do precyzyjnego zdefiniowania interakcji poszczególnych warstw.

W mojej aplikacji (aplikacja CAD / CAM do obsługi maszyn do cięcia metalu) moja konstrukcja wygląda tak.

  • Formularze implementujące interfejsy formularzy
  • UIDLL z widokami implementującymi interfejsy widoków, które współdziałają z formularzami za pośrednictwem interfejsu formularza. Konkretne widoki rejestrują się w UIViewDLL Views wykonują obiekty poleceń znalezione w bibliotekach poleceń, które współdziałają z modelem.
  • Biblioteki poleceń; listy poleceń implementujących ICommand. Polecenie, które współdziała z widokami, robi to za pośrednictwem interfejsów udostępnionych w UIViewDLL.
  • UIViewDLL; uwidacznia interfejsy widoku używane przez polecenia.
  • Model; klasy i kolekcje, które tworzą podstawowe struktury danych mojej aplikacji. Dla mnie są to takie rzeczy jak materiał, ścieżki cięcia, kształt, arkusze, palniki itp.
  • Użyteczność; biblioteka DLL, która ma powszechnie używane klasy narzędzi używane w mojej firmie, które obejmują różne aplikacje. Na przykład złożone funkcje matematyczne.
RS Conley
źródło
3

Możesz użyć Architektury Korporacyjnej, wzorców i praktyk jako punktu wyjścia, chociaż są one nieco przestarzałe.

W rozdziale „Ogólne wskazówki” znajduje się Architektura aplikacji dla .NET: Projektowanie aplikacji i usług , która jest dobrym wprowadzeniem do sposobów .NET i warstwowej aplikacji N-warstwowej.

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

Bardziej formalne „wzorce” można znaleźć w artykule Wzorce rozwiązań korporacyjnych wykorzystujące Microsoft .NET . (źródło: microsoft.com )tekst alternatywny

Aby wymienić tylko kilka,

Eugene Yokota
źródło
2

Pierwsze dobre wyjaśnienie wzorców projektowania interfejsu użytkownika, które przeczytałem, znalazło się na blogu Jeremy'ego Millera - Building Your Own CAB . Opisuje typowe wzorce - pasywny widok, MVP itp. I opisuje niektóre sposoby ich implementacji w języku C #.

Jeremy
źródło
1

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

Wiaczesław Wołkow
źródło