Winformsアプリケーションを作り直していて、UIにプレゼンテーションモデルパターンのバリエーションを採用したいと思います。私が正しくやっているのなら、誰かが次の説明から教えてもらえますか?
次のように依存関係を設定することにしました。
Model <---- Presentation Model <---- View
あれは:
モデルはそれ自体以外は何も認識していません。
プレゼンテーションモデルにはモデルへの参照があります(ただし、その逆はありません)。
ビューにはプレゼンテーションモデルへの参照があります(ただし、その逆はありません)。
Winformsデータバインディングを使用して、ビューとプレゼンテーションモデルの同期を維持しています。
これで、フォームの[閉じる]ボタンをクリックするなどの処理が必要な場合を除いて、これはすべて魅力のように機能します。プレゼンテーションモデルにはビューへの参照がないため、ビューによって公開されたイベントをサブスクライブすることはできません。したがって、私は次の松葉杖を思いついた:
Presentation Model View
+--+ +--+
| | | |
| | | <--------X closeButton.Click event fires
| | | |
| | +--------X |
| | CloseRequested = true | | |
| | +--------> |
| | | |
| | CloseRequested CloseRequested | |
| <-----------------------------------< |
| | | |
| X--------+ | |
| | | IsClosed = true | |
| <--------+ | |
| | | |
| | IsClosed MustClose | |
| >-----------------------------------> |
| | | |
| | | X--------> view.Close()
| | | |
+--+ +--+
あれは:
ユーザーは「閉じる」ボタンをクリックします。
ボタンの
Clickイベントはビューにキャプチャされ、プロパティを設定することで反応しますCloseRequested。データバインディングは、この値をプレゼンテーションモデルの対応するプロパティに転送します。
プレゼンテーションモデルは、プロパティを設定することでこの変更に対応します
IsClosed。データバインディングは、この値をビューのに転送します
MustClose。ビューは、それ自体を閉じることによってこの変更に反応します。
プレゼンテーションモデルはビューから非常にうまく分離されており、その逆も同様ですが、これは1つのボタンコマンドを処理するためだけの多くの作業です。私が決定した依存関係グラフを考えると、もっと簡単な方法はありますか?