2

WINFORMS の MVP パターンを実装しようとしています。ボタンとグリッドを使用した単純なボタンをクリックすると、グリッドがロードされ、ユーザーはグリッドに値を入力できます。

私のボタンクリックイベントには、次のようなものがあります:

_presenter.LoadGrid();

これは単純明快です。

私の質問は、グリッドに関してです...行クリックイベントを発生させることを計画しています....グリッドの特定の列/行などの後続の入力フィールドを有効/無効にするために.

プレゼンターに GUI 要素を含めるべきではなく、ビュー (フォーム) に実際にロジックを含めるべきではないことを理解していますか?

そのため、GridRowClick イベントを発生させるには、ビジネス ルール (ロジック) に基づいてグリッド (GUI) を操作する必要があります。プレゼンターにそのクリックイベントのロジックを処理させるか、フォームを処理させるかで迷っていますか?

プレゼンターがクリック イベントを処理する場合、GUI コンポーネントは含まれませんか? ビューがクリックイベントを処理する場合、フィールド名などはすべてビジネス主導 (ロジック) であり、ビジネス層から返されたデータテーブルに基づいて動的にバインドされます。

どんなアドバイスでも大歓迎です。

乾杯

4

3 に答える 3

1

MVPには(少なくとも)2つのバリエーションがあります。

  • パッシブビューパターン
  • コントローラパターンの監視

パッシブビューは、その名前が示すように、UIをユーザーとアプリケーション間の多かれ少なかれパッシブなインターフェイスとして扱います。テスト可能なコードをできるだけ多くプレゼンターに移動し、ビューを残して最も基本的なUI更新のみを処理します。

監視コントローラーは、データ同期を処理できるようにすることで、ビューにもう少し責任を与えます。これは通常、データバインディングを介して行われます。

いずれの場合も、イベント処理はプレゼンターメソッドに委任することで実行されます。

EventHandler()
{
    presenter.HandleEvent();
}

イベントの処理でフォームに変更を加える必要がある場合は、更新が必要なものをプロパティとして公開します。

public string PropertyThatNeedsToBeUpdated
{
    get
    {
        return Control.Property;
    }
    set
    {
        Control.Property = value;
    }
}

パッシブビューの場合、グリッドはハードルです。それらの複雑さにより、考えられるすべてのイベントをキャプチャするのが面倒になります。監視コントローラーを使用すると、データ同期をデータバインドされたコントロールに任せるため、グリッドがはるかに簡単になります。

どちらが自分の状況に適しているかについて、判断を下す必要があります。

于 2009-05-15T01:48:14.357 に答える
0

重要なのは、すべてのビジネスロジックをテスト可能なプレゼンターに取り込むことです。

ビューはプレゼンターを呼び出してビジネスロジックを実行し、必要な情報(クリックされた行に関連付けられたデータなど)を渡す必要があります。

次に、プレゼンターはビジネスロジックを実行し、データを更新します。

必要な変更の種類によっては、既存のデータバインディングでビューを自動的に更新するのに十分な場合があるため、これで十分な場合があります。十分でない場合、プレゼンターは、必要な変更を行うために、ビューに対して(もちろん、そのインターフェースを介して)1つ以上の呼び出しを行うことができます。

あなたが言うように、ビュー内の重要なコードの量を最小限に抑えることを目指す必要があります。特に、ビューにはビジネスロジックが含まれていてはなりません。

編集:

MVPおよびその他のプレゼンテーションパターンに関するいくつかの優れた一般情報は次のとおりです:http://martinfowler.com/eaaDev/uiArchs.html

于 2009-05-15T00:04:06.340 に答える
0

Polymorphic Podcast のビデオ シリーズのパート 4 もご覧ください。彼は監視コントローラー パターンを使用し、データ グリッドを処理するための手法を示します。シリーズ全体は、実際には私にとって良い紹介でした。

http://polymorphicpodcast.com/shows/mv-patterns/

于 2009-09-11T15:41:06.670 に答える