Pattern di progettazione dell'interfaccia utente per Windows Form (come MVVM per WPF)


159

MVVM è più comunemente usato con WPF perché è perfettamente adatto per questo. Ma che dire di Windows Form? Esiste un modello di approccio / progettazione consolidato e comunemente usato come questo anche per Windows Form? Uno che funziona esplicitamente bene con Windows Form? C'è un libro o un articolo che lo descrive bene? Forse basato su MVP o MVC?



5
questa sembra essere una buona domanda. vedere i voti e le stelle ..
nawfal,

13
In che modo questo non è costruttivo quando è esattamente la conversazione che stavo cercando? Moderato, non dettato!
Bloke CAD

Quindi sostanzialmente, MVVM per WinForms è possibile. Ma la maggior parte delle persone preferisce parlare di come hanno usato MVP / MVC in passato, invece di portare avanti l'idea di Winforms / MVVM. O piuttosto si soffermano su come si chiama veramente Presenter Model non MVVM e su quanto dolce MVVM sia per WPF.
H. Abraham Chavez,

9
Sono sempre deluso quando questo tipo di domanda viene chiusa come "non costruttiva" poiché, come già menzionato in un altro poster, questo tipo di discussione è esattamente quello che sono venuto qui a cercare. Moderatori, per favore, prendete una visione più liberale e rilassatevi sul pulsante "non costruttivo".
Tim Long,

Risposte:


94

Ho provato MVP e sembra funzionare benissimo anche con Windows Form. Questo libro contiene un esempio di moduli di Windows con pattern MVP (applicazione di libro paga di esempio). L'applicazione non è così complessa ma ti darà un'idea di come procedere per crearla.

Principi, schemi e pratiche agili in C # ...

È possibile ottenere il codice sorgente nel codice sorgente

MODIFICARE:

Esistono due varianti del modello MVP (a) Vista passiva e (b) supervisione del controller

Per scenari di database complessi, preferisco seguire il modello di supervisione del controller. Nel supervisionare il modello del controller, la responsabilità della banca dati rimane alla vista. Quindi, per treeview / datagrid questo dovrebbe essere nelle rispettive viste, solo la vista della logica agnostica dovrebbe passare al presentatore.

Consiglio di dare un'occhiata al seguente framework MVP # MVC - Un framework MVP

Non andare con il nome (è un framework MVP).

Winforms semplici MVP video Winforms - MVP

Un esempio di gestione dell'elenco a discesa MVP - DropDownList

Esempio di rilegatura treeview semplice (rilegatura del povero). È possibile aggiungere qualsiasi logica specifica treeview in BindTree ().

Di seguito è riportato lo snippet di codice .... non testato, digitato direttamente dal pensiero ....

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
Grazie, l'esempio in quel libro è un po 'troppo semplice per i miei gusti. Come farei in Winforms e MVP con una visualizzazione di dati più complessa come TreeView o DataGridView quanta logica (quale) risiederebbe dove?
Bitbonk,

bitbonk - Ho aggiornato la risposta e verificherò se posso ottenere maggiori informazioni.
rajesh pillai,

1
Il metodo BindTree mi sembra un po 'imperfetto. Improvvisamente il View conosce il modello. Questa è una buona cosa? Ci devono essere tonnellate di persone che devono affrontare questo tipo di problemi. Sono sorpreso che non ci siano libri a riguardo. Dal momento che ci sono libri su tutto nel mondo .NET.
Bitbonk,

1
Non è un difetto. Questo è lo stile "Supervisory Controller" del modello MVP. In Supervisor Controller, la vista è a conoscenza del modello (questo è un modello di presentazione). L'altro è "Vista passiva", in cui la vista è totalmente disaccoppiata dal modello.
rajesh pillai,

14

Come è già stato detto, ho sempre lavorato secondo uno schema MVP durante l'utilizzo di Winforms. Ma il modello di progettazione che userete non significa che userete bene. Ci sono molti anti-pattern collegati a MVP.

Se si desidera avviare tutto in modo corretto, è necessario utilizzare il framework per la creazione di smart client. Quindi raccomanderò di usare quel design e quelle pratiche: Smart Client Software Factory http://www.codeplex.com/smartclient

Qui hai una discussione sugli attuali framework di smart client: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: Mi piace questo post sull'anti-pattern MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Spero che questo ti aiuti


9

Il modello Model-View-ViewModel (MVVM) è un modello di progettazione. Per definizione un modello di progettazione mostra una soluzione comune nel mondo orientato agli oggetti e questa soluzione può essere applicata in varie piattaforme (WPF, WinForms, Java Swing, ecc.). Concordo sul fatto che MVVM sia utilizzato al meglio con WPF perché sfrutta le forti capacità di associazione. Tuttavia, Windows Form supporta anche l'associazione dei dati.

L' adattatore WAF per Windows Form mostra come applicare il modello MVVM in un'applicazione Windows Form.


3
WAF è per WPF, non per Windows Form. Il collegamento è fuorviante.
Bentley Davis,

2
Il collegamento non è fuorviante. WAF Windows Forms Adapter viene fornito con un'applicazione MVVM implementata due volte: 1. WinForms; 2. WPF. Entrambe le applicazioni condividono i livelli inferiori che sono indipendenti dalla tecnologia UI.
jbe,

5

Ho scritto su una variante dei modelli di progettazione MVP / MVVM chiamata MVP-VM, che è una soluzione su misura per le applicazioni winforms che richiedono una copertura completa dei test e utilizzano l'associazione dei dati come meccanismo principale per mantenere la presentazione aggiornata con i dati del modello.

MVVM per .NET Winforms

MVVM (Model View View Model) introduce un approccio simile per separare la presentazione dai dati in un ambiente che abilita l'associazione dei dati (WPF). Poiché .NET framework 2.0 offre già un'infrastruttura avanzata di associazione dei dati che consente anche l'associazione in fase di progettazione degli oggetti dell'applicazione: l'entità "Visualizza modello" può adattarsi abbastanza bene all'ambiente basato su MVP.


4

Ho posto la stessa domanda a due dei miei colleghi tecnici: è possibile MVVM per Windows Form? Entrambi mi hanno dato la stessa identica risposta: " Assolutamente no! WindowsForms manca dei ricchi collegamenti di WPF e Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) e manca anche i TypeConverters ."

  • Pattern attivatore schermo per Windows Form - puoi trovarlo qui , portato da Caliburn.Micro di jagui
  • Rich Bindings e TypeConverters - Truss di Kent Boogaart, lo fa in modo indipendente dall'interfaccia utente
  • Comandi - WPF Application Framework (WAF) ha un progetto WafWinFormsAdapter che si occupa di alcune cose MVVM, vale a dire i comandi

Ancora una volta, possiamo avere MVVM per WinForms? Sì possiamo. Abbiamo tutti i pezzi. Dobbiamo solo incollarli insieme.


4

Credo che MVP sia un modello adatto allo sviluppo di WinForms - come è in parte evidenziato dal suo uso in CAB - il framework Microsoft per WinForms.

Uso MVP in WinForms per estrarre il codice dalla vista, perché non riesco a testare il codice vista. E anche per abilitare il codice che deve essere riutilizzato (o duplicato) per rimanere fuori dalla vista dove non può essere condiviso.

Posso fare riferimento al mio progetto in cui utilizzo il modello MVP ExceptionReporter.NET . Anche se sono sicuro di non usarlo perfettamente.

Hai menzionato MVVM che lavora per WPF - penso che il motivo sia dovuto al forte supporto di associazione dei dati. Se non stavi utilizzando l'associazione dati in WPF (e certamente non è obbligatorio), puoi scegliere MVP. Il punto è che MVP è una scelta forte per qualsiasi applicazione lato client. E forse una scelta "migliore", anche in WPF, se prevedi di condividere il codice tra progetti che non sono WPF.

Per ulteriori prove del valore dell'utilizzo di MVP in WinForms, vedere la presentazione video di Boodhoo sull'utilizzo di MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter E un articolo MSDN dello stesso autore su http://msdn.microsoft.com/en-us/magazine/cc188690.aspx


Le cose di Boodhoo sembrano riguardare WebForms, non WinForms. A meno che non ci siano più cose più avanti nel video ...?
Roger Lipscombe,

3

Il metodo BindTree mi sembra un po 'imperfetto. Improvvisamente il View conosce il modello. Questa è una buona cosa? Ci devono essere tonnellate di persone che devono affrontare questo tipo di problemi. Sono sorpreso che non ci siano libri a riguardo. Dal momento che ci sono libri su tutto nel mondo .NET.

Questi progetti non riguardano il nascondere il modello piuttosto che definire con precisione le interazioni tra i diversi strati delle applicazioni. È possibile modificare completamente il back-end e finché si passa un modello tramite Bindtree, l'interfaccia utente continuerà a funzionare.

Ora il modello di classe potrebbe essere una cattiva scelta di un nome nell'esempio che Rajesh fornisce. Può essere TreeData o RecordsData. Indipendentemente da come lo definisci, ha ciò che ti serve per utilizzare il meccanismo di associazione di Winforms per associare un controllo specifico ai dati sottostanti.

Il miglior sito per cercare questo tipo di materiale è qui . Martin Fowler ha raccolto una varietà di utili modelli di progettazione dell'interfaccia utente e modelli di progettazione aziendale.

Ancora una volta la chiave di ciò è l'uso di interfacce per definire con precisione il modo in cui ciascun livello interagisce tra loro.

Nella mia applicazione (un'applicazione CAD / CAM utilizzata per eseguire macchine per il taglio dei metalli) la mia struttura appare così.

  • Moduli che implementano interfacce di moduli
  • UIDLL con viste che implementano interfacce di vista che interagiscono con i moduli attraverso l'interfaccia del modulo. Le viste specifiche si registrano con UIViewDLL Views esegue gli oggetti comando trovati nelle librerie dei comandi che interagiscono con il modello.
  • Librerie di comandi; elenchi di comandi che implementano ICommand. Il comando che interagisce con le viste lo fa attraverso le interfacce esposte in UIViewDLL.
  • UIViewDLL; espone le interfacce di visualizzazione utilizzate dai comandi.
  • Modello; le classi e le raccolte che compongono le strutture di dati di base della mia applicazione. Per me queste sono cose come materiale, percorsi di taglio, forma, fogli, torce, ecc.
  • Utilità; una DLL che ha comunemente usato classi di utilità utilizzate dalla mia azienda che si estendono su diverse applicazioni. Ad esempio funzioni matematiche complesse.

3

È possibile utilizzare Enterprise Architecture, Patterns and Practices come punto di partenza, sebbene siano leggermente datati.

Sotto la guida generale c'è Application Architecture for .NET: Designing Applications and Services , che è una buona introduzione ai modi .NET e alle applicazioni a più livelli.

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

Per "modelli" più formali, esistono modelli di soluzioni Enterprise che utilizzano Microsoft .NET . (fonte: microsoft.com )testo alternativo

Per dirne alcuni,


2

La prima buona spiegazione dei modelli di progettazione dell'interfaccia utente che ho letto è stata nel blog di Jeremy Miller - Building Your Own CAB . Descrive i modelli comuni - Passive View, MVP, ecc. E affronta alcuni dei modi in cui potresti implementarli in C #.


1

Puoi provare MugenMvvmToolkit che consente di utilizzare un "MVVM puro" per WinForms. A causa del fatto che supporta i binding su tutte le piattaforme, tutte le funzionalità di binding native disponibili per la piattaforma WPF sono disponibili su tutte le piattaforme (incluso WinForms).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.