2012-02-15 13 views
7

Principalmente provengo de un fondo ASP.Net con algunos MVC. También he hecho un poco de Silverlight y MVVM, sin embargo, ahora estoy a punto de pasar a Winforms, que tengo muy poca experiencia, así que me pregunto cómo abordar MVP.MVP en Winforms

Ejemplos de MVP típicos muestran al presentador estableciendo una propiedad de vista (a través de algún tipo de interfaz IView), con la vista concreta poniendo ese valor de propiedad en un cuadro de texto, por ejemplo. En lugar de este enfoque arcaico, ¿se puede utilizar INotifyPropertyChanged en MVP y, de ser así, cómo? ¡Un ejemplo muy rápido sería realmente útil!

Si tuviera que crear un modelo que implementara INotifyPropertyChanged, ¿entonces no se parece más a MVVM? (es decir, el presentador actualiza el modelo y, a través de la magia de INotifyPropertyChanged, la vista se actualiza). Sin embargo, en todas partes que he leído sobre MVVM y Winforms, la gente dice que no es adecuado. ¿Por qué? Según entiendo, usted puede enlazar datos sobre la propiedad de cualquier control, entonces, ¿qué es Winforms que falta? Estoy tratando de entender las deficiencias de la unión de datos en Winforms en comparación con WPF, y por qué MVVM no se puede utilizar, ya que parece más fácil de implementar que MVP.

Gracias de antemano Andy.

Respuesta

8

Acabo de verificar cómo el enlace de datos en WinForms usa INotifyPropertyChanged. El enlace a través de la BindingSource apoya realmente datos INotifyPropertyChanged si el origen de datos objeto de la propiedad BindingSource o modelo correspondiente a DataMember implementa esto. Puede usar M. Fowlers supervisando presentador/controlador en su totalidad aquí: Ni siquiera necesita un código escrito a mano, BindingSource sincroniza la vista con las propiedades del modelo en ambas direcciones (modelo -> ver y ver - > modelo), y si el modelo es compatible con INotifyPropertyChanged, la vista se actualizará automáticamente. Las construcciones de código que he utilizado hasta ahora:

  1. Durante vista de inicialización:

    this.bindingSource.DataSource = this.presenter;

  2. generada diseñador de código:

    this.textBoxPhone.DataBindings.Add (nueva System.Windows.Forms.Binding ("texto", "this.bindingSource, Model.Phone", true, System.Windows .Forms.DataSourceUpdateMode.OnPropertyChanged));

La clase del modelo: Clase

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

El presentador:

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

Eso es realmente útil saber. Gracias por publicar la respuesta. –

+0

De hecho, un ejemplo útil. Sin embargo, ¿no es un problema exponer el Modelo directamente a la vista? Tal vez sería mejor usar un ViewModel. – kasperhj

0

Trate de encontrar ejemplos de Supervisor Controlador de sabor MVP, lo uso con WinForms, diría con mucho éxito. Las entidades admiten INotifyPropertyChanged, el presentador las vincula a la vista y el presentador se suscribe al evento PropertyChanged para que sepa cuándo la vista ha cambiado algo (comprobación sucia). La vista solo es responsable de los datos de enlace, todas las demás funciones se transfieren al presentador.

0

que no se pierda nada. MVVM es muy adecuado con WinForms. Microsoft solo fomenta el uso del patrón WPF y MVVM con él.