1

Silverlight 5、Prism 4.1、MEF を使用。

インターフェイスによってエクスポートされるビューがあります。

サンプル:

[Export(typeof(IUploadListView)), PartCreationPolicy(CreationPolicy.NonShared)]
public partial class UploadListView : RadWindow, IUploadListView
{
}

このビューを2回再利用したいモデル(メインメニューモデルとしましょう)があります。ビューの各インスタンスは、1 回だけ呼び出して表示する必要があります。動作が変わるように、下にあるビューモデルの UploadType を変更します。

サンプル:

var view = this.serviceLocator.GetInstance<IUploadListView>();
view.UploadListViewModel.UploadType = UploadType.MyType1;
view.Show();

その他のメニュー オプション:

var view = this.serviceLocator.GetInstance<IUploadListView>();
view.UploadListViewModel.UploadType = UploadType.MyType2;
view.Show();

問題はこれです:

  • NonShared ポリシーを使用すると、一意のインスタンスが表示可能になります。問題は、ユーザーが同じメニュー項目を押すと、インスタンスが 2 回 (またはそれ以上) 表示されることです。
  • 共有ポリシーを使用する場合、最初のビューが表示されると、2 番目のメニュー項目は最初のビューを再利用するため、1 つのビューのみが表示されます。

私が望むのは、IUploadListView 型のインスタンスが表示されているかどうかを確認できる必要があることです。その場合は、インスタンスを再利用して Show() を呼び出すだけです。インスタンスが見つからない場合は、MEF に (サービス ロケーターを使用して) インスタンスを作成してもらいます。

これを達成する方法はありますか?

4

1 に答える 1

0

ビューまたはそのビュー モデルにINavigationAwareインターフェイスを実装し、IsNavigationTargetメソッドを利用する必要があります。

RequestNavigate領域に対して が呼び出されると、がIsNavigationTarget呼び出されて、ビューのインスタンスがそれをアクティブにするかどうかを決定できるようになります。true を返すと、ビューがアクティブになります。それ以外の場合、Prism はビューの新しいインスタンスを作成し、リージョンに配置してアクティブにします。

詳細については、 http://msdn.microsoft.com/en-us/library/gg430861 (v=pandp.40).aspx を参照してください。

于 2012-10-17T08:23:36.893 に答える