UI-Entwurfsmuster für Windows Forms (wie MVVM für WPF)


159

MVVM wird am häufigsten mit WPF verwendet, da es perfekt dafür geeignet ist. Aber was ist mit Windows Forms? Gibt es ein etabliertes und häufig verwendetes Ansatz- / Entwurfsmuster wie dieses auch für Windows Forms? Eine, die explizit gut mit Windows Forms funktioniert? Gibt es ein Buch oder einen Artikel, der dies gut beschreibt? Vielleicht MVP oder MVC basiert?



5
Das scheint eine gute Frage zu sein. siehe die Stimmen und Sterne ..
Nawfal

13
Wie ist das nicht konstruktiv, wenn es genau das Gespräch ist, nach dem ich gesucht habe? Moderat, nicht diktieren!
CAD Kerl

Grundsätzlich ist MVVM für WinForms möglich. Aber die meisten Leute würden lieber darüber sprechen, wie sie MVP / MVC in der Vergangenheit verwendet haben, anstatt die Winforms / MVVM-Idee voranzutreiben. Oder sie beschäftigen sich eher damit, wie es Presenter Model heißt, nicht MVVM, und wie süß MVVM für WPF ist.
H. Abraham Chavez

9
Ich bin immer enttäuscht, wenn diese Art von Frage als "nicht konstruktiv" abgeschlossen wird, da diese Art der Diskussion, wie bereits erwähnt, genau das ist, wonach ich hierher gekommen bin. Moderatoren, bitte nehmen Sie eine liberalere Sichtweise ein und klicken Sie auf die Schaltfläche "Nicht konstruktiv".
Tim Long

Antworten:


94

Ich habe MVP ausprobiert und es scheint auch mit Windows Forms hervorragend zu funktionieren. Dieses Buch enthält ein Beispiel für Windows-Formulare mit MVP-Muster (Beispiel für eine Gehaltsabrechnungsanwendung). Die Anwendung ist nicht so komplex, gibt Ihnen jedoch eine Vorstellung davon, wie Sie sie erstellen.

Agile Prinzipien, Muster und Praktiken in C # ...

Sie können den Quellcode erhalten Source Code

BEARBEITEN:

Es gibt zwei Variationen des MVP-Musters: (a) Passive Ansicht und (b) Überwachung des Controllers

Für komplexe Datenbindungsszenarien bevorzuge ich das Supervising-Controller-Muster. Bei der Überwachung des Controller-Musters liegt die Verantwortung für die Datenbindung bei der Ansicht. Für Treeview / Datagrid sollte dies also in den jeweiligen Ansichten sein, nur die viewunabhängige Logik sollte auf den Präsentator übertragen werden.

Ich empfehle einen Blick auf das folgende MVP-Framework MVC # - Ein MVP-Framework

Gehen Sie nicht mit dem Namen (es ist ein MVP-Framework).

Einfache Winforms MVP Video Winforms - MVP

Ein Beispiel für den Umgang mit der Dropdown-Liste MVP - DropDownList

Einfaches Beispiel für eine Baumansichtsbindung (Bindung eines armen Mannes). Sie können in BindTree () eine beliebige Baumansicht-spezifische Logik hinzufügen.

Unten ist das Code-Snippet ... nicht getestet, direkt aus Gedanken eingegeben ...

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
Danke, das Beispiel in diesem Buch ist für meinen Geschmack etwas zu einfach. Wie würde ich in Winforms und MVP mit komplexeren Datenanzeigen wie TreeView oder DataGridView vorgehen, wie viel (welche) Logik würde sich wo befinden?
Bitbonk

bitbonk - Ich habe die Antwort aktualisiert und werde prüfen, ob ich weitere Informationen erhalten kann.
Rajesh Pillai

1
Die BindTree-Methode scheint mir ein wenig fehlerhaft zu sein. Plötzlich kennt die Ansicht das Modell. Ist das eine gute Sache? Es muss Unmengen von Menschen geben, die mit solchen Problemen konfrontiert werden. Ich bin überrascht, dass es keine Bücher darüber gibt. Da gibt es Bücher über alles in der .NET Welt.
Bitbonk

1
Das ist kein Fehler. Dies ist die Variante des MVP-Musters "Supervisory Controller". In Supervisor Controller kennt die Ansicht das Modell (dies ist ein Präsentationsmodell). Die andere ist "Passive Ansicht", bei der die Ansicht vollständig vom Modell entkoppelt ist.
Rajesh Pillai

14

Wie bereits gesagt, habe ich bei der Verwendung von Winforms immer in einem MVP-Muster gearbeitet. Das von Ihnen verwendete Entwurfsmuster bedeutet jedoch nicht, dass Sie es richtig verwenden. Mit MVP sind viele Anti-Patterns verbunden.

Wenn Sie alles gut starten möchten, müssen Sie das Framework zum Erstellen eines Smart Clients verwenden. Daher werde ich empfehlen, dieses Design und diese Vorgehensweisen zu verwenden: Smart Client Software Factory http://www.codeplex.com/smartclient

Sie haben hier eine Diskussion über die aktuellen Smart Client-Frameworks: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: Ich mag diesen Beitrag über die MVP-Anti-Patterns: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Hoffe das hilft


9

Das Model-View-ViewModel (MVVM) -Muster ist ein Entwurfsmuster. Per Definition zeigt ein Entwurfsmuster eine gängige Lösung in der objektorientierten Welt und diese Lösung kann auf verschiedenen Plattformen (WPF, WinForms, Java Swing usw.) angewendet werden. Ich bin damit einverstanden, dass MVVM am besten mit WPF verwendet wird, da es die starken Bindungsfähigkeiten nutzt. Windows Forms unterstützt jedoch auch die Datenbindung.

Der WAF Windows Forms-Adapter zeigt, wie das MVVM-Muster in einer Windows Forms-Anwendung angewendet wird.


3
Die WAF ist für WPF, nicht für Windows Forms. Der Link ist irreführend.
Bentley Davis

2
Der Link ist nicht irreführend. Der WAF Windows Forms Adapter wird mit einer MVVM-Anwendung geliefert, die zweimal implementiert wird: 1. WinForms; 2. WPF. Beide Anwendungen teilen sich die unteren Schichten, die unabhängig von der UI-Technologie sind.
30.

5

Ich habe über eine Variation von MVP / MVVM-Entwurfsmustern namens MVP-VM geschrieben. Dies ist eine maßgeschneiderte Lösung für Winforms-Anwendungen, die eine vollständige Testabdeckung erfordern und die Datenbindung als Hauptmechanismus verwenden, um die Präsentation mit Modelldaten auf dem neuesten Stand zu halten.

MVVM für .NET Winforms

MVVM (Model View View Model) führt einen ähnlichen Ansatz zum Trennen der Präsentation von den Daten in einer Umgebung ein, die die Datenbindung (WPF) ermöglicht. Da .NET Framework 2.0 bereits eine erweiterte Datenbindungsinfrastruktur bietet, die auch die Entwurfszeitbindung von Anwendungsobjekten ermöglicht, kann die Entität "Ansichtsmodell" recht gut in eine MVP-basierte Umgebung passen.


4

Ich habe zwei meiner Technikfreaks dieselbe Frage gestellt: Ist MVVM für WindowsForms möglich? Beide gaben mir genau die gleiche Antwort: "Auf keinen Fall! In WindowsForms fehlen die umfangreichen Bindungen von WPF und Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) und auch die TypeConverters ."

  • Screen Activator Pattern für WindowsForms - Sie finden es hier , portiert von Caliburn.Micro by jagui
  • Rich Bindings und TypeConverters - Truss von Kent Boogaart, macht es auf eine UI-unabhängige Weise
  • Befehle - WPF Application Framework (WAF) verfügt über ein WafWinFormsAdapter-Projekt, das sich um einige MVVM-Aufgaben kümmert, nämlich um Befehle

Können wir wieder MVVM für WinForms haben? Ja wir können. Wir haben alle Teile. Wir müssen sie nur zusammenkleben.


4

Ich glaube, dass MVP ein Muster ist, das sich gut für die WinForms-Entwicklung eignet - was teilweise durch die Verwendung in CAB - Microsofts Framework für WinForms - belegt wird.

Ich verwende MVP in WinForms, um Code aus der Ansicht zu extrahieren, da ich den Ansichtscode nicht testen kann. Außerdem kann Code, der wiederverwendet (oder dupliziert) werden muss, nicht in der Ansicht angezeigt werden, in der er nicht freigegeben werden kann.

Ich kann auf mein eigenes Projekt verweisen, in dem ich das MVP-Muster ExceptionReporter.NET verwende . Obwohl ich sicher bin, dass ich es nicht perfekt benutze.

Sie haben erwähnt, dass MVVM für WPF arbeitet. Ich denke, der Grund dafür liegt in der starken Unterstützung der Datenbindung. Wenn Sie in WPF keine Datenbindung verwenden (und dies ist sicherlich nicht obligatorisch), können Sie MVP auswählen. Der Punkt ist, dass MVP eine gute Wahl für jede clientseitige Anwendung ist. Und möglicherweise eine bessere Wahl, selbst in WPF, wenn Sie vorhaben, Code zwischen Projekten zu teilen, die nicht WPF sind.

Weitere Belege für den Wert der Verwendung von MVP in WinForms finden Sie in der Videopräsentation von Boodhoo zur Verwendung von MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter Und ein MSDN-Artikel desselben Autors unter http://msdn.microsoft.com/en-us/magazine/cc188690.aspx


Bei Boodhoo geht es anscheinend um WebForms, nicht um WinForms. Es sei denn, es gibt später im Video mehr ...?
Roger Lipscombe

3

Die BindTree-Methode scheint mir ein wenig fehlerhaft zu sein. Plötzlich kennt die Ansicht das Modell. Ist das eine gute Sache? Es muss Unmengen von Menschen geben, die mit solchen Problemen konfrontiert werden. Ich bin überrascht, dass es keine Bücher darüber gibt. Da gibt es Bücher über alles in der .NET Welt.

Bei diesem Entwurf geht es nicht darum, das Modell auszublenden, sondern vielmehr darum, die Wechselwirkungen zwischen den verschiedenen Ebenen der Anwendungen genau zu definieren. Sie können das Backend vollständig ändern. Solange Sie ein Modell über Bindtree übergeben, funktioniert Ihre Benutzeroberfläche weiterhin.

Jetzt kann Klassenmodell eine schlechte Wahl eines Namens in dem Beispiel sein, das Rajesh gibt. Dies kann TreeData oder RecordsData sein. Wie auch immer Sie es definieren, es hat alles, was Sie brauchen, um den Bindungsmechanismus von Winforms zu verwenden, um ein bestimmtes Steuerelement an die zugrunde liegenden Daten zu binden.

Die beste Seite, um nach dieser Art von Material zu suchen, ist hier . Martin Fowler hat eine Vielzahl nützlicher UI-Designmuster und Enterprise-Designmuster gesammelt.

Der Schlüssel dazu ist wiederum die Verwendung von Schnittstellen, um genau zu definieren, wie jede Schicht miteinander interagiert.

In meiner eigenen Anwendung (einer CAD / CAM-Anwendung zum Ausführen von Zerspanungsmaschinen) sieht meine Struktur so aus.

  • Formulare, die Formularschnittstellen implementieren
  • UIDLL mit Ansichten, die Ansichtsschnittstellen implementieren, die über die Formularschnittstelle mit Formularen interagieren. Die spezifischen Ansichten registrieren sich bei UIViewDLL Views und führen Befehlsobjekte aus, die in Befehlsbibliotheken gefunden wurden, die mit dem Modell interagieren.
  • Befehlsbibliotheken; Listen von Befehlen, die ICommand implementieren. Der Befehl, der mit Ansichten interagiert, erfolgt über die in UIViewDLL bereitgestellten Schnittstellen.
  • UIViewDLL; macht die von den Befehlen verwendeten Ansichtsschnittstellen verfügbar.
  • Modell; die Klassen und Sammlungen, die die Kerndatenstrukturen meiner Anwendung bilden. Für mich sind dies Dinge wie Material, Schneidwege, Form, Bleche, Fackeln usw.
  • Nützlichkeit; Eine DLL, die häufig von meinem Unternehmen verwendete Dienstprogrammklassen verwendet, die sich über verschiedene Anwendungen erstrecken. Zum Beispiel komplexe mathematische Funktionen.

3

Sie können Unternehmensarchitektur, Muster und Vorgehensweisen als Ausgangspunkt verwenden, obwohl diese leicht veraltet sind.

Unter Allgemeine Anleitung finden Sie die Anwendungsarchitektur für .NET: Entwerfen von Anwendungen und Diensten , die eine gute Einführung in .NET-Methoden und mehrschichtige N-Tier-Anwendungen bietet.

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

Für formellere "Muster" gibt es Enterprise Solution Patterns mit Microsoft .NET . (Quelle: microsoft.com )Alt-Text

Um ein paar zu nennen,


2

Die erste gute Erklärung für UI-Designmuster, die ich gelesen habe, war in Jeremy Millers Blog - Building Your Own CAB . Es beschreibt die gängigen Muster - Passive Ansicht, MVP usw. - und erläutert einige Möglichkeiten, wie Sie sie in C # implementieren können.


1

Sie können MugenMvvmToolkit ausprobieren , mit dem Sie eine "reine MVVM" für WinForms verwenden können. Aufgrund der Tatsache, dass es Bindungen auf allen Plattformen unterstützt, sind alle für die WPF-Plattform verfügbaren nativen Bindungsfunktionen auf allen Plattformen verfügbar (einschließlich WinForms).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.