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


MVVM wird am häufigsten mit WPF verwendet, da es perfekt dafür geeignet ist. Aber was ist mit Windows Forms? Gibt es auch für Windows Forms ein etabliertes und gebräuchliches Vorgehensmuster? Eine, die bei Windows Forms besonders gut funktioniert? Gibt es ein Buch oder einen Artikel, der das gut beschreibt? Vielleicht MVP oder MVC basiert?


140
2018-02-27 16:26


Ursprung


Antworten:


Ich habe versucht MVP und es scheint auch mit Windows-Formularen gut zu funktionieren. Dieses Buch enthält ein Beispiel für Windows-Formulare mit MVP-Muster (Beispiel für eine Gehaltsabrechnung). Die Anwendung ist nicht so komplex, wird Ihnen aber eine Idee geben, wie Sie sie erstellen können.

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

Sie können den Quellcode unter erhalten Quellcode

BEARBEITEN:

Es gibt zwei Variationen des MVP-Musters (a) Passive Sichtweise und (b) Überwachungskontrolleur

Für komplexe Databinding-Szenarien bevorzuge ich das Supervising-Controller-Pattern. Bei der Überwachung des Steuerungsmusters liegt die Verantwortung für die Datenbindung bei der Ansicht. Für TreeView / Datagrid sollte dies also in den jeweiligen Views sein, nur View Agnostic Logic sollte zum Presenter verschoben werden.

Ich empfehle Ihnen, sich das folgende MVP-Framework anzusehen MVC # - Ein MVP-Framework

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

Einfaches winforms MVP Video Winforms - MVP

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

Einfaches Treeview-Binding-Beispiel (Armanbindung). Sie können in BindTree () beliebige treeview-spezifische Logik hinzufügen.

Unten ist das Code-Snippet .... nicht getestet, direkt eingetippt von ....

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);
   }
}

85
2018-02-27 16:40



Wie bereits erwähnt, habe ich bei Winforms immer in einem MVP-Muster gearbeitet. Aber das Designmuster, das Sie verwenden werden, bedeutet nicht, dass Sie richtig verwenden werden. Es gibt viele Anti-Patterns, die an MVP angehängt sind.

Wenn Sie alles auf eine gute Art und Weise starten möchten, müssen Sie das Framework zum Erstellen eines Smart Clients verwenden. Also werde ich empfehlen, dieses Design und Praktiken zu verwenden: Smart-Client-Softwarefabrik  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 auf den MVP Anti-Patterns: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Hoffe das hilft


13
2018-03-12 04:05



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

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


8
2017-09-20 18:06



Im folgenden Beitrag wird eine Variante von MVP / MVVM-Entwurfsmustern mit der Bezeichnung MVP-VM vorgestellt, die eine maßgeschneiderte Lösung für Winforms-Anwendungen darstellt, die eine vollständige Testabdeckung erfordert und die Datenbindung als Hauptmechanismus zum Aktualisieren der Präsentation mit Modelldaten verwendet.

MVVM für .NET Winforms

MVVM (Modellansichtsansichtsmodell)   führt einen ähnlichen Ansatz für   Trennung der Präsentation von der   Daten in einer Umgebung, die befähigt   Datenbindung (WPF). Seit .NET   Framework 2.0 bietet bereits erweiterte Funktionen   Datenbindungsinfrastruktur, die auch   ermöglicht Design Zeitbindung von   Anwendungsobjekte - das 'View Model'   Die Entity passt ziemlich gut in MVP   Umgebung.


5
2017-08-03 21:09



Ich glaube, dass MVP ein Muster ist, das für die WinForms-Entwicklung gut geeignet ist (wie es teilweise durch seine prominente Verwendung in CAB - Microsofts Framework für WinForms-Anwendungen - belegt wird).

Ich benutze MVP, in WinForms Apps, hauptsächlich um Code aus der View zu extrahieren, da ich den View Code nicht testen kann / werde. Und auch um Code zu aktivieren, der wiederverwendet werden muss (oder dupliziert wird), um außerhalb der View zu bleiben, wo er nicht einfach geteilt werden kann.

Als Beweis für die Effektivität von MVP in WinForms werde ich auf mein eigenes Projekt verweisen. Ich arbeite am ExceptionReporter-Projekt (http://www.codeplex.com/ExceptionReporter) wo ich eigentlich Code zwischen einer WPF und WinForms "Version" der Software wiederverwenden muss. Daher verwende ich MVP für beide Technologien - so kann ich denselben Presenter zwischen beiden Baugruppen verwenden. Und vermeiden Sie es, diesen Code zu duplizieren.

Sie haben erwähnt, dass MVVM für WPF arbeitet - ich denke, der Grund dafür ist die starke Unterstützung für Datenbindungen. Wenn Sie keine Datenbindung in WPF verwenden (und es ist sicherlich nicht obligatorisch), dann könnten Sie MVP wählen. Der Punkt ist, dass MVP eine starke Wahl für jede clientseitige Anwendung ist. Und möglicherweise eine bessere Wahl, sogar in WPF, wenn Sie Code zwischen Projekten teilen möchten, die nicht WPF sind.

Weitere Hinweise zum Nutzen von MVP in WinForms finden Sie in Boodhoos Videopräsentation 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 des gleichen Autors bei http://msdn.microsoft.com/en-us/magazine/cc188690.aspx


4
2018-03-14 00:36



Sie können verwenden Unternehmensarchitektur, Muster und Praktiken als Ausgangspunkt, obwohl sie leicht datiert sind.

Unter Allgemeine Anleitung gibt es Anwendungsarchitektur für .NET: Entwerfen von Anwendungen und DienstenDies ist eine gute Einführung in .NET-Wege und eine geschichtete N-Tier-Anwendung.

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

Für formellere "Muster" gibt es Unternehmenslösungsmuster mit Microsoft .NET. alt text http://i.msdn.microsoft.com/ms998492.Chp_02OrganizingPatterns_Fig06%28en-us%2CMSDN.10%29.gif

Um ein paar zu nennen,


3
2018-03-11 05:36



Die BindTree-Methode scheint ein wenig zu sein   fehlerhaft für mich. Plötzlich der Blick   kennt das Model. Ist das gut?   Ding? Es muss Tonnen von Leuten geben   konfrontiert mit dieser Art von   Probleme. Ich bin überrascht, dass da   sind keine Bücher darüber. Seitdem   sind Bücher über alles in .NET   Welt.

Bei diesen Designs geht es nicht darum, das Modell zu verstecken, sondern die Wechselwirkungen zwischen den verschiedenen Schichten der Anwendungen präzise zu definieren. Sie können das Backend vollständig ändern, und solange Sie ein Modell über Bindtree übergeben, funktioniert Ihre Benutzeroberfläche weiterhin.

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

Der beste Ort, um nach dieser Art von Material zu suchen, ist Hier. Martin Fowler hat eine Vielzahl von nützlichen UI-Designmustern und Enterprise-Designmustern zusammengestellt.

Der Schlüssel dazu ist die Verwendung von Schnittstellen, um genau zu definieren, wie die einzelnen Ebenen miteinander interagieren.

In meiner eigenen Anwendung (eine CAD / CAM-Anwendung, die zum Ausführen von Metallschneidemaschinen verwendet wird) sieht meine Struktur so aus.

  • Formulare, die Formularschnittstellen implementieren
  • UIDLL mit Ansichten, die die Sicht implementieren Schnittstellen, die mit Formularen interagieren über die Formularschnittstelle. Das bestimmte Ansichten registrieren sich selbst mit UIViewDLL Views führt die gefundenen Command-Objekte aus in Befehlsbibliotheken, die interagieren mit dem Modell.
  • Befehlsbibliotheken; Listen von Befehle, die ICommand implementieren. Der Befehl, mit dem interagiert wird Ansichten tun dies über die Schnittstellen ausgesetzt in UIViewDLL.
  • UIViewDLL; Macht die View-Interfaces verfügbar verwendet von den Befehlen.
  • Modell; die Klassen und die Sammlung, die bilden Kerndatenstrukturen meines Anwendung. Für mich sind das Dinge wie Material, Schneidepfade, Form, Bleche, Taschenlampen usw.
  • Nützlichkeit; eine DLL, die häufig verwendet wird Nutzungsklassen, die von meiner Firma verwendet werden das überspannen unterschiedliche Anwendung. Zum Beispiel komplexe mathematische Funktionen.

3
2018-03-12 13:46



Ich habe diese Frage an zwei meiner Techniker gestellt: Ist MVVM für WindowsForms möglich? Beide gaben mir die exakt gleiche Antwort: "Auf keinen Fall! WindowsForms fehlen die Rich-Bindungen von WPF und Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) und es fehlen auch die TypeConverter. "

  • Screen Activator Pattern für WindowsForms - Sie können es finden Hier, von Caliburn.Micro von Jagui portiert
  • Rich Bindings und TypeConverters - Fachwerk von Kent Boogaart, macht es in einer UI unabhängigen Weise
  • Befehle - WPF-Anwendungsrahmen (WAF) hat ein WafWinFormsAdapter-Projekt, das sich um einige MVVM-Befehle kümmert

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


3
2018-05-27 00:42



Die erste gute Erklärung der UI-Designmuster, die ich gelesen habe, war in Jeremy Millers Blog - Bauen Sie Ihre eigene CAB. Es beschreibt die üblichen Muster - Passive View, MVP, etc. und behandelt einige der Möglichkeiten, wie Sie sie in C # implementieren können.


2
2018-03-12 17:42