2012-02-15 13 views
7

Jestem głównie z tła ASP.Net z niektórymi MVC. Zrobiłem też trochę Silverlight i MVVM, jednak wkrótce przejdę do WinForm, z którego mam bardzo mało doświadczenia, więc zastanawiam się jak poradzić sobie z MVP.MVP w WinForm

Typowe próbki MVP pokazują prezenter ustawiający właściwość widoku (poprzez pewien rodzaj interfejsu IView), z konkretnym widokiem umieszczającym tę wartość właściwości na przykład w polu tekstowym. Zamiast tego archaicznego podejścia, czy można użyć INotifyPropertyChanged w MVP, a jeśli tak, to w jaki sposób? Bardzo szybki przykład byłby naprawdę użyteczny!

Jeśli miałbym stworzyć model, który zaimplementował INotifyPropertyChanged, czy nie jest to bardziej podobne do MVVM? (tj. prezenter aktualizuje model i dzięki magii INotifyPropertyChanged widok jest aktualizowany). Jednak wszędzie, gdzie czytałem o MVVM i WinForm, ludzie mówią, że nie jest to odpowiednie. Czemu? Rozumiem, że możesz ustalić praktycznie dowolną właściwość kontrolki, więc czego brakuje w WinForm? Próbuję zrozumieć braki wiązania danych w Winformach w porównaniu z WPF i dlaczego nie można użyć MVVM, ponieważ wydaje się prostsze do wdrożenia niż MVP.

Z góry dziękuję Andy.

Odpowiedz

8

Właśnie sprawdziłem, jak powiązanie danych w WinForms używa INotifyPropertyChanged. wiążące przez BindingSource robi naprawdę wspierać dane INotifyPropertyChanged jeśli DataSource przedmiot własności BindingSource lub modelu odpowiadającego DataMember realizuje to. Możesz w pełni wykorzystać program M. Fowlers, który nadzoruje prezenter/kontroler: Nie potrzebujesz nawet kodu odręcznego, BindingSource synchronizuje widok z właściwościami modelu w obu kierunkach (model -> widok i widok - > model), a jeśli model obsługuje INotifyPropertyChanged, widok zostanie automatycznie zaktualizowany. Konstrukty kod I dotychczas stosowanych:

  1. W widoku inicjalizacji:

    this.bindingSource.DataSource = this.presenter;

  2. Designer wygenerowany kod:

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

Klasa modelu: klasa

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

Prezenter:

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

To naprawdę przydatne wiedzieć. Dziękujemy za wysłanie odpowiedzi. –

+0

Rzeczywiście przydatny przykład. Jednak czy nie jest to problem polegający na bezpośrednim wyświetlaniu modelu do widoku? Być może lepiej byłoby użyć ViewModel. – kasperhj

0

Spróbuj znaleźć przykłady kontrolnego kontrolera MVP Kontrolera, używam go z WinForms, bardzo skutecznie powiem. Podmioty obsługują INotifyPropertyChanged, prezenter wiąże je z widokiem, a prezenter subskrybuje zdarzenie PropertyChanged, dzięki czemu wie, kiedy widok zmienił coś (nieczytelne sprawdzanie). Widok jest odpowiedzialny tylko za wiązanie danych, wszystkie inne funkcje są przenoszone do prezentera.

0

Nie przegap niczego. MVVM jest bardzo odpowiedni dla WinForms. Microsoft uwzględnia jedynie użycie wzoru WPF i MVVM.