如何在prism / mef中重用视图

时间:2012-10-17 07:35:49

标签: silverlight prism mef

使用Silverlight 5,Prism 4.1和MEF。

我有一个视图,它是由其界面导出的。

样品:

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

我有一个模型(比如一个主菜单模型),想要重复使用这个视图2次。必须调用视图的每个实例并仅显示一次。我更改了底层视图模型上的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策略时,我会看到可显示的唯一实例。问题不在于当用户按下相同的菜单项时实例显示两次(或更多)。
  • 使用共享策略时,显示第一个视图时,第二个菜单项将重复使用第一个视图,因此只显示一个视图。

我想要的是我必须能够检查是否显示了IUploadListView类型的实例,当发生这种情况时,我只是重用该实例并调用Show()。如果没有找到实例,我希望MEF为我创建它(使用服务定位器)。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

您应该在视图或其视图模型中实现INavigationAware界面,并利用IsNavigationTarget方法。

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

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/gg430861(v=pandp.40).aspx