2012-02-15 48 views
7

我主要是一個ASP.Net背景與一些MVC。我也做了一點Silverlight和MVVM,但是現在我正要進入我很少有經驗的Winforms,所以我想知道如何解決MVP。MVP中的WinForms

典型MVP樣品顯示演示者設定的圖屬性(通過某種接口IVIEW的)中,用把該屬性值轉換成例如一個文本框的具體視圖。而不是這種古老的方法,可以在MVP中使用INotifyPropertyChanged,如果是這樣的話?一個非常快速的例子會非常有用!

如果我是創造實現INotifyPropertyChanged的那麼一款型號是不是更像MVVM? (即演示者更新模型,並通過INotifyPropertyChanged的魔術視圖得到更新)。然而到處都是MVVM和Winforms,人們都說它不適合。爲什麼?我的理解是,你可以綁定任何控件的屬性,所以Winforms缺失了什麼?我試圖理解Winforms中的數據綁定與WPF相比的缺點,以及爲什麼MVVM無法使用,因爲實現比MVP更簡單。

預先感謝 安迪。

回答

8

我剛剛檢查了WinForms中的數據綁定如何使用INotifyPropertyChanged。如果的BindingSource或模型屬性的數據源對象對應於數據成員實現此 的數據通過的BindingSource不真正支持結合INotifyPropertyChanged的。您可以使用M. Fowlers在此處監控演示者/控制器: 您甚至不需要手寫代碼,即可同時使視圖與模型屬性在兩個方向(模型 - >視圖和視圖 - >型號),如果型號支持INotifyPropertyChanged則視圖將自動更新。 的代碼構造我迄今使用:

  1. 在視圖初始化:

    this.bindingSource.DataSource = this.presenter;

  2. 設計器生成的代碼:

    this.textBoxPhone.DataBindings.Add(新System.Windows.Forms.Binding( 「文本」,this.bindingSource, 「Model.Phone」,真實,System.Windows .Forms.DataSourceUpdateMode。OnPropertyChanged));

模型類:

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

主講類:

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

這是真正有用的知道。感謝您發佈回覆。 – 2012-05-08 10:30:36

+0

的確是一個有用的例子。但是,將模型直接暴露給視圖不是一個問題嗎?也許最好使用ViewModel。 – kasperhj 2012-05-30 14:38:36

0

試圖找到監督控制器MVP的味道的例子,我使用與WinForms的,非常成功,我會說。實體支持INotifyPropertyChanged的,主持人它們綁定到視圖,並演示訂閱PropertyChanged事件,以便它知道什麼時候改變觀點的東西(髒檢查)。視圖僅負責綁定數據,所有其他功能都移至演示者。

0

你不會錯過任何東西。 MVVM非常適合WinForms。微軟只會鼓勵使用WPF和MVVM模式。