1

使用 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 为我创建它(使用服务定位器)。

有没有办法做到这一点?

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 回答