現在、Silverlight 4 の最新の Prism を使用してアプリケーションを構築しています。モジュールがあり、そのモジュールにはビュー モデルを持つ 2 つのビューがあります。また、ビューごとに 2 つの領域を持つモジュール ビューもあります。モジュールの初期化では、ビューとビュー モデルを Unity コンテナーに登録し、ビューを対応するリージョンに登録します。問題は、ビューがテーブルの詳細情報に似たものを表示する必要があることです。最初のビューには利用可能なエンティティが表示され、2 番目のビューには選択されたエンティティの詳細が表示されます。
最初に選択したエンティティを渡す方法が必要です。新しく作成された最初のビューには選択されたエンティティがなく、新しく作成された 2 番目のビューには詳細が表示されません。
現在、私はこのようにしています:モジュールで2つのビューモデルを作成し、それらをインスタンスとしてUnityコンテナーに登録してから、ビューを対応する領域のタイプとして登録します。各ビューは、EventAggregator から EntitySelectedEvent をサブスクライブします。モジュール初期化子は、初期化後にこのイベントを発行します。このようにして、2 つのビューが同じエンティティを選択します。
私はこれが見苦しいことを知っています - ビューモデルの1つからこのイベントを公開しようとしましたが、問題はPrismのEventAggregatorが永続的なサブスクライバーをサポートしていないことです.それを起動すると、受信もイベントも行われません。これは EventAggregator の通常の動作であることはわかっていますが、ビュー モデルが初期化順序に依存せずにイベントを発生させることができる場合の解決策を探しています。つまり、最初のモデルが 2 番目のモデルが作成される前にイベントを発生させ、2 番目のモデルが発生する可能性があります。サブスクライブした後、この「キューに入れられた」イベントを受け取ります。
そのような動作をサポートする WPF/SL の他のメッセージング実装はありますか、またはメディエーター (私の例ではモジュール自体です) を使用することは結局それほど悪い考えではありませんか? メディエーターの大きな問題の 1 つは、モデルを初期化ですぐに作成する必要があり、モデルをコンテナーに型として登録できないことです。これは、再びサブスクライバーの欠落につながるためです。