2009-06-30 6 views
8

私は過去数日間winformsを使用してMVPパターンを試していますが、実際にはわからないことが1つあります。別のビューからサブフォームを作成する方法これは有効なオプションでしょうか。MVPでサブビューをロードする

public class MyForm : IMainFormView 
    { 
     private MainFormPresenter pres; 
     public MyForm() { pres = new MainFormPresenter(this); } 

     //Event from interface. 
     public event EventHandler<EventArgs> LoadSecondForm; 

     public void SomeButtonClick() 
     { 
      LoadSecondForm(this, EventArgs.Empty); 
     } 
    } 

    public class MainFormPresenter 
    { 
     private IMainFormView mView; 

     public MainFormPresenter(IMainFormView view) { 
      this.mView = view; 
      this.Initialize(); 
     } 

     private void Initialize() { 
      this.mView.LoadSecondForm += new EventHandler<EventArgs>(mView_LoadSecondForm); 
     } 


     private void mView_LoadSecondForm(object sender, EventArgs e) { 
      SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
      newform.Load(); // Load the form and raise the events on its presenter. 
     } 
    } 

私はあなたがこのパターンを使用してサブフォームをロードし、そしてどのようにサブフォームの最初のページからIDを言う渡すだろうかと主に心配です。

ありがとうございました。

答えて

2

this other SO questionをご覧ください。 WPFではなくWinFormsに関係しますが、問題は同じであるようです。

本質的には、補助ウィンドウにサービス(WindowsServiceまたはDialogServiceなどと呼ぶこともあります)を表示する必要があると考えます。それは、あなたがそれを理解するとすぐに、Dependency Injectionが答えになるので、物事を視点に入れるのに役立ちます。

答えでは、これをイベントでモデル化しますが、DialogServiceのShowDialogメソッドを呼び出すより明示的なモデルを使用することをお勧めします。しかし、それぞれのアプローチの仕組みはそれほど違いはありません。

1

この

まず上のコメントのカップルこの

private void mView_LoadSecondForm(object sender, EventArgs e) { 
     SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
     newform.Load(); // Load the form and raise the events on its presenter. 
    } 

あなたがSecondFormためThirdFormを代用することにした場合どうなりますか?あなたはnewform = new SecondFormのすべての呼び出しを見つけて変更を加える必要があります。

代わりにあなたがここに続いてコマンドオブジェクトに

public class CreateSecondForm : ICommand 
    { 

     public void Execute() { 
      SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
      newform.Load(); // Load the form and raise the events on its presenter. 
     } 

    } 

をSecondFormの作成をラップする必要がありますし、あなたがsubsituteしたい場合は、他の場所は、第二の形式

この構文を使用しています
private void mView_LoadSecondForm(object sender, EventArgs e) { 
    CreateSecondForm createCmd = new CreateSecondForm(); 
    createCmd.Execute(); // Load the form and raise the events on its presenter. 
} 

が表示されますSecondFormのための完全に新しいフォームでは、必要な場所は1つだけです。ステータスまたは設定値を渡す場合は、コマンドのコンストラクタを使用します。別のPresenterまたはViewを渡して、そのインターフェイスから情報を引き出すこともできます。

新しいコマンドを使用する代わりに、ビューを実装するフォームを登録することをお勧めします。これは初期化中に行われ、レジストリはメインアプリケーションクラスからハングアップします。

たとえば、他の場所でソフトウェア

public void InitializeApp() { 
     //Stuff .... 
     MyApp.ViewForm.Add(new MySecondForm); 

     //Stuff .... 

} 

public class MySecondForm : ISecondFormView, IViewForm 
    { 
     //Stuff .... 
     Public ViewFormEnum ViewFormType { 
      return ViewFormEnum.SecondForm; 
     } 
     //Stuff .... 
    } 

次にコマンドは、このような設定です。

public class CreateSecondForm : ICommand 
    { 
     myApp theApp; 
     public CreateSecondForm(myApp thisApp) { 
      theApp = thisApp; 
     } 

     public void Execute() { 
      SecondForm newform = theApp.Find(ViewFormEnum.SecondForm); 
      if (newForm != null) 
       newform.Load(); // Load the form and raise the events on its presenter. 
     } 

    } 

Pardon my C#私の主要な言語ではありません。この方法の利点は、Formsを含むアセンブリを異なるアセンブリの異なるアセンブリに置き換えることができることです。これは、フォームの代わりにモッククラスを作成できるテストの自動化に特に便利です。また、完全なアプリケーションのサブセットを解放するのに便利なnullビューを処理するように設定することもできます。

ビューの作成をラップするコマンドを使用することを強くお勧めしますが、 Viewを登録するという第2の提案は、アプリケーションによっては過剰です。私のCAD/CAMアプリケーションでは、2Dメタルカッティングテーブルの設定と制御のさまざまな側面に使用される数十のダイアログといくつかの異なるメインフォームがあります。しかし、私の会社の他のアプリケーションの中には、彼らがほとんどシンプルなユーティリティであるので、私は単純なアプローチを使用しています。

関連する問題