Winforms MVP グリッド イベントの問題
-
21-08-2019 - |
質問
WINFORMS の MVP パターンを実装しようとしています。ボタンとグリッドを使用するシンプルな方法で、ボタンをクリックするとグリッドがロードされ、ユーザーはグリッドに値を入力できます。
ボタンのクリックイベントには、次のようなものがあります。
_presenter.LoadGrid();
それはシンプルで簡単です。
私の質問はグリッドに関してです...グリッドの特定の列/行などの後続の入力フィールドを有効/無効にするために、行クリックイベントを起動することを計画しています。
プレゼンターには GUI 要素を含めるべきではなく、ビュー (フォーム) には実際にはロジックを含めるべきではないことを理解していますか?
したがって、GridRowClick イベントを発生させるには、ビジネス ルール (ロジック) に基づいてグリッド (GUI) を操作する必要があります。プレゼンターにクリック イベントのロジックを処理させるかフォームを処理させるか迷っています。
プレゼンターがクリック イベントを処理する場合、それには gui コンポーネントが含まれないでしょうか?ビューがクリック イベントを処理する場合、フィールド名などはすべてビジネス駆動 (ロジック) であり、ビジネス レイヤーから返されたデータテーブルに基づいて動的にバインドされます。
アドバイスをいただければ幸いです。
乾杯
解決
MVP には (少なくとも) 2 つのバリエーションがあります。
- パッシブビューパターン
- 監視コントローラパターン
パッシブ ビューは、その名前が示すように、UI をユーザーとアプリケーション間の多かれ少なかれ受動的なインターフェイスとして扱います。テスト可能なコードをできるだけ多くプレゼンターに移動し、ビューは最も基本的な UI 更新のみを処理できるようにします。
監視コントローラーは、データ同期の処理をビューに許可することで、ビューにもう少し責任を与えます。これは通常、データ バインディングを通じて行われます。
どちらの場合も、イベント処理はプレゼンター メソッドに委任することで実現されます。
EventHandler()
{
presenter.HandleEvent();
}
イベントの処理でフォームを変更する必要がある場合は、更新する必要があるものをプロパティとして公開します。
public string PropertyThatNeedsToBeUpdated
{
get
{
return Control.Property;
}
set
{
Control.Property = value;
}
}
パッシブ ビューにとって、グリッドはハードルです。それらの複雑さにより、考えられるすべてのイベントを捕捉することが困難になります。監視コントローラーを使用すると、データの同期をデータ バインドされたコントロールに任せることができるため、グリッドの作成がはるかに簡単になります。
どちらが自分の状況に適しているか判断する必要があります。
他のヒント
重要なのは、すべてのビジネス ロジックをテスト可能なプレゼンターに取り込むことです。
ビューはプレゼンターを呼び出してビジネス ロジックを実行し、必要な情報 (例:クリックされた行に関連付けられたデータ)。
次に、プレゼンターはビジネス ロジックを実行し、データを更新します。
必要な変更の種類によっては、ビューを自動的に更新するには既存のデータ バインディングで十分な場合があるため、これだけで十分な場合があります。それが十分でない場合は、プレゼンターは、必要な変更を加えるために、ビューに対して 1 つ以上の呼び出しを (もちろんインターフェイス経由で) 行うことができます。
あなたが言うように、ビュー内の重要なコードの量を最小限に抑えることを目指す必要があり、特にビューにはビジネス ロジックを含めるべきではありません。
編集:
MVP およびその他のプレゼンテーション パターンに関する一般的な情報は次のとおりです。 http://martinfowler.com/eaaDev/uiArchs.html
あなたはポリモーフィックポッドキャストからのビデオシリーズのパート4をチェックアウトする場合があります。彼は監督コントローラパターンを使用し、データグリッドを処理するための手法を示しています。全シリーズは、実際に私のために良い導入しました。