2012-02-15 12 views
7

Sono principalmente da uno sfondo ASP.Net con alcuni MVC. Ho anche fatto un po 'di Silverlight e MVVM, ma ora sto per entrare in Winforms di cui ho poca esperienza, quindi mi chiedo come affrontare MVP.MVP in Winform

Esempi di MVP tipici mostrano al relatore l'impostazione di una proprietà di visualizzazione (tramite una sorta di interfaccia IView), con la vista concreta che inserisce il valore di una proprietà in una casella di testo, ad esempio. Invece di questo approccio arcaico, è possibile utilizzare INotifyPropertyChanged in MVP e, in caso affermativo, come? Un esempio molto veloce sarebbe davvero utile!

Se dovessi creare un modello che ha implementato INotifyPropertyChanged, non è più simile a MVVM? (Ad esempio, il presentatore aggiorna il modello e tramite la magia di INotifyPropertyChanged la vista viene aggiornata). Eppure ovunque ho letto su MVVM e Winforms, la gente dice che non è adatto. Perché? La mia comprensione è che è possibile catalogare le proprietà di qualsiasi controllo, quindi quali sono le Winform mancanti? Sto cercando di capire le carenze del databinding in Winforms rispetto a WPF, e perché MVVM non può essere utilizzato, in quanto sembra più semplice da implementare rispetto a MVP.

Grazie in anticipo Andy.

risposta

8

Ho appena controllato come il data binding in WinForms utilizza INotifyPropertyChanged. I associazione di dati attraverso il BindingSource ha davvero supporta INotifyPropertyChanged se il DataSource oggetto della struttura BindingSource o modello corrispondente al DataMember implementa questa. Puoi utilizzare M. Fowlers come supervisore di presentatore/controllore qui: Non hai nemmeno bisogno di un codice scritto a mano, lo BindingSource sincronizza la vista con le proprietà del modello in entrambe le direzioni (modello -> vista e vista - > modello) e se il modello supporta InotifyPropertyChanged, la vista verrà aggiornata automaticamente. I costrutti di codice ho usato finora:

  1. Durante vista inizializzazione:

    this.bindingSource.DataSource = this.presenter;

  2. codice Designer-generated:

    this.textBoxPhone.DataBindings.Add (nuova System.Windows.Forms.Binding ("Testo", this.bindingSource, "Model.Phone", veri, System.Windows .Forms.DataSourceUpdateMode.OnPropertyChanged));

La classe del modello: classe

public class Customer : INotifyPropertyChanged 
{ 
    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (_firstName == value) 
       return; 
      _firstName = value; 
      NotifyPropertyChanged("FirstName"); 
     } 
    } 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      if (_lastName == value) 
       return; 
      _lastName = value; 
      NotifyPropertyChanged("LastName"); 
     } 
    } 

    private string _company; 
    public string Company 
    { 
     get { return _company; } 
     set 
     { 
      if (_company == value) 
       return; 
      _company = value; 
      NotifyPropertyChanged("Company"); 
     } 
    } 

    private string _phone; 
    public string Phone 
    { 
     get { return _phone; } 
     set 
     { 
      if (_phone == value) 
       return; 
      _phone = value; 
      NotifyPropertyChanged("Phone"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Il presentatore:

public class CustomerPresenter 
{ 
    public CustomerPresenter(Customer model) 
    { 
     if (model == null) 
      throw new ArgumentNullException("model"); 

     this.Model = model; 
    } 

    public Customer Model { get; set; } 

    public ICustomerView View { private get; set; } 
} 
+0

Questo è davvero utile sapere. Grazie per aver pubblicato la risposta. –

+0

Davvero un esempio utile. Tuttavia, non è un problema esponendo direttamente il modello alla vista? Forse sarebbe meglio usare un ViewModel. – kasperhj

0

Provare a trovare esempi di controllo MVP Controller supervisione, lo uso con WinForms, con molto successo direi. Le entità supportano INotifyPropertyChanged, il presenter li associa alla vista e il presentatore sottoscrive l'evento PropertyChanged in modo che sappia quando la visualizzazione ha cambiato qualcosa (controllo sporco). La visualizzazione è responsabile solo per i dati di associazione, tutte le altre funzionalità vengono spostate nel presentatore.

0

di non perdere nulla. MVVM è molto adatto con WinForms. Microsoft incoraggia solo l'uso del pattern WPF e MVVM con esso.