2012-02-15 4 views
7

私は主にASP.NetのバックグラウンドにMVCをいくつか使用しています。私もSilverlightとMVVMをやったことがありますが、今私は経験がほとんどないWinformsに移行しようとしていますので、MVPに取り組む方法が不思議です。MVP in Winforms

典型的なMVPサンプルは、特定の種類のIViewインターフェイスを使用してビュープロパティを設定するプレゼンターを示し、具体的なビューでそのプロパティ値をたとえばテキストボックスに配置します。この古風なアプローチの代わりに、MVPでINotifyPropertyChangedを利用できますか?非常に簡単な例が本当に便利です!

もし私がINotifyPropertyChangedを実装したモデルを作成しようとしたら、これはMVVMのようなものではありませんか? (つまり、プレゼンターがモデルを更新し、INotifyPropertyChangedの魔法によってビューが更新されます)。しかし、私がMVVMとWinformsについて読んだところでは、それは適切ではないと人々は言う。どうして?私の理解は、WinFormsは何が欠けているので、あなたはちょうどすべてのコントロールのプロパティについてdatabindことができるということですか?私はWPFと比較してWinformsのデータバインディングの欠点を理解しようとしています。MVVMよりも実装が簡単なMVVMを使用できない理由を理解しようとしています。

ありがとうございました アンディ。

答えて

8

私は、WinFormsのデータバインディングがどのように使用されるのかを確認しました。INotifyPropertyChangedのBindingSourceを通じて結合 データは実際にデータメンバーに対応のBindingSourceやモデルプロパティののDataSourceオブジェクトは、これを実装する場合。をINotifyPropertyChangedのサポートしています 手書きコードは必要ありません。BindingSourceは、ビューをモデルのプロパティと両方向で同期させます(モデル - >ビューとビュー - )。 >モデル)、モデルがINotifyPropertyChangedをサポートしている場合、ビューは自動的に更新されます。 コード構築物Iは、これまで使用してきた:

  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

これは本当に知っていると便利です。回答を投稿していただきありがとうございます。 –

+0

確かに有用な例です。しかし、モデルをビューに直接公開するのはちょっとした問題ではないですか?おそらく、ViewModelを使うほうがいいでしょう。 – kasperhj

0

監督コントローラのMVPフレーバーの例を見てみましょう。私はWinFormsでこれを使用しています。エンティティはINotifyPropertyChangedをサポートし、プレゼンターはビューにバインドし、PresenterはPropertyChangedイベントをサブスクライブし、ビューが何か変更されたとき(ダーティチェック)を知るようにします。ビューはデータのバインドのみを担当し、他のすべての機能はプレゼンターに移動されます。

0

あなたは何をお見逃しなく。 MVVMはWinFormsに非常に適しています。マイクロソフトでは、WPFおよびMVVMパターンの使用を推奨しています。

関連する問題