Silverlight 如何在prism/mef中重用视图

Silverlight 如何在prism/mef中重用视图,silverlight,prism,mef,Silverlight,Prism,Mef,使用Silverlight 5、Prism 4.1和MEF 我有一个视图,通过它的接口导出 样本: [Export(typeof(IUploadListView)), PartCreationPolicy(CreationPolicy.NonShared)] public partial class UploadListView : RadWindow, IUploadListView { } var view = this.serviceLocator.GetInstance<IUpl

使用Silverlight 5、Prism 4.1和MEF

我有一个视图,通过它的接口导出

样本:

[Export(typeof(IUploadListView)), PartCreationPolicy(CreationPolicy.NonShared)]
public partial class UploadListView : RadWindow, IUploadListView
{
}
var view = this.serviceLocator.GetInstance<IUploadListView>();
view.UploadListViewModel.UploadType = UploadType.MyType1;
view.Show();
我有一个模型(比如说一个主菜单模型),它希望重用这个视图2次。视图的每个实例必须被调用并仅显示一次。我更改了参考底图viewmodel上的UploadType,这样行为就会改变

样本:

[Export(typeof(IUploadListView)), PartCreationPolicy(CreationPolicy.NonShared)]
public partial class UploadListView : RadWindow, IUploadListView
{
}
var view = this.serviceLocator.GetInstance<IUploadListView>();
view.UploadListViewModel.UploadType = UploadType.MyType1;
view.Show();
var view=this.serviceLocator.GetInstance();
view.UploadListViewModel.UploadType=UploadType.MyType1;
view.Show();
和其他菜单选项:

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

  • 使用非共享策略时,我确实可以显示唯一的实例。问题在于,当用户按下同一菜单项时,实例会显示两次(或更多)
  • 使用共享策略时,当显示第一个视图时,第二个菜单项将重用第一个视图,因此仅显示一个视图
我想要的是,我必须能够检查是否显示了类型为IUploadListView的实例,当出现这种情况时,我只需重用该实例并调用Show()。当找不到实例时,我希望MEF为我创建它(使用服务定位器)

有没有办法做到这一点?

您应该在视图或其视图模型中实现接口,并利用
IsNavigationTarget
方法

当为区域调用
RequestNavigate
时,将调用
IsNavigationTarget
,以允许视图实例决定是否应激活它。如果返回true,则视图将被激活。否则Prism将创建视图的新实例,将其放置在区域中并激活它

有关更多详细信息,请参阅