質問

WpfアプリケーションのナビゲーションにPrismを使用しています。いくつかのモジュールがあり、それぞれがブートストラップのIoCコンテナーを使用して送信される一般的なコマンドを介してメインメニューに登録されています。メニューエントリは、ナビゲーション用の共通コマンドにバインドされています。これにより、一部の地域で正しいビューが開きます。すべては、Prismサイトで見つけた推奨事項に基づいています。

私の問題は、メイン領域でViewAまたはViewBを開くかどうかを示す条件があるモジュールがあることです。例:顧客モジュールがあり、次に「顧客」がいるとします。メインビューで顧客モジュールを開くメニュー項目。そして、条件があります。アクティブな顧客がいる場合、メニュー項目をクリックしたときにCustomerDetailsViewを開きたい場合、CustomersAdminViewを開きます。

これを解決するための推奨されるアプローチは何ですか?いくつかのオプションがありますが、それらはすべて少しハックに聞こえます。現在、上記の例のMasterCustomerViewの作成に取り組んでいます。次に、このビューは条件を確認し、UserControlを開いて内部の管理者の詳細を表示します。しかし、私はこのソリューションに満足していません-それは正当なアプローチでしょうか?もっといい?

役に立ちましたか?

解決

Prismを中心に構築したメニューシステムでは、ビューのタイプではなくデリゲートを渡すことができるビューを登録するモジュールのオーバーロードを提供しました。このデリゲートでは、ビューを作成する方法を決定できるように、関連情報をデリゲートに渡すことができます。

これは少し複雑ですが、関連する例をいくつか示します。

public interface IMenuRegistry
{
     void RegisterMenuItem(string title, 
                           Func<RelevantInformation, Object> executeFunction, 
                           Func<RelevantInformation, bool> canExecuteFunction);

     void RegisterMenuItem(string title, Type viewType);
}

ここでは、「関連情報」に渡される型があることに注意してください。現在の顧客などを含めることができます。ユーザーがメニュー項目をクリックすると、デリゲートを呼び出し、その決定に必要なすべての情報を渡します。適切な領域に配置できるViewオブジェクトを返します。

また、モジュールが&quot; canExecute&quot;を渡すことを許可します。コマンドの動作方法に似たデリゲート(実際、すべてのメニュー登録を取得してコマンドに変換します)。このようにして、RelevantInformationの何らかの条件によってメニュー項目が無効になる場合、モジュールはそれ自体を無効にすることもできます。

実際には、これはこの問題を解決する多くの方法の1つにすぎませんが、これは私がやっていることに近いものです。うまくいけば、それが役に立つか、問題を解決する別の方法について考えてもらうことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top