使用Prism进行导航时如何创建视图/视图模型的新实例

时间:2012-10-16 13:49:28

标签: silverlight-4.0 prism prism-4

我正在尝试控制何时创建新视图以及何时显示现有视图。

这是Prism文档中“导航到现有视图”部分中概述的非常类似的场景,但我无法让它完全运行: http://msdn.microsoft.com/en-us/library/gg430861(v=pandp.40).aspx

我发现我可以创建视图/视图模型以开始,但是我无法创建它的新实例。即我希望一次存在多个实例。

以下是视图模型的示例:

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class DataEntryPageViewModel : INavigationAware, IRegionMemberLifetime
{
    private Guid id;

    [ImportingConstructor]
    public DataEntryPageViewModel()
    {
        id = Guid.NewGuid();
    }

    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        // In actual fact there would be more logic here to determine
        // whether this should be shown to the user
        return false;
    }

    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
    }

    public bool KeepAlive
    {
        // For the purposes of this example we don't want the view or the viewModel
        // to be disposed of.
        get { return true; }
    }
}

我按照以下方式导航:

m_RegionManager.RequestNavigate(
               "MainRegion",
               new Uri("/DataEntryPageView", UriKind.Relative));

所以第一次调用上面的视图时会显示出来。

下次我调用RequestNavigate时,会触发IsNavigationTarget并返回false。我当时希望它做的是创建一个新实例,但这不会发生。我知道它没有发生,因为构造函数没有被命中,UI也没有更新以显示视图的新实例。

任何想法如何让它创建一个新实例?

非常感谢,

修改

我注意到第二次调用RequestNavigate(请求同一视图的另一个实例)时,回调会报告错误“视图已存在于区域中”。因此,似乎我可以在一个区域中有多个不同视图的实例,但不能在同一视图的多个实例中。我对此的理解并不是很好,但我可能是错的。

3 个答案:

答案 0 :(得分:0)

为什么要在创建新视图时不创建视图?在我看来,你正在使用MEF。

  1. 使用容器解析视图的新实例
  2. 将新视图实例添加到MainRegion
  3. 然后调用Navigate并处理IsNavigationTarget中的相应逻辑

答案 1 :(得分:0)

您应该在视图中使用合同名称为[Export]的{​​{1}}属性。

答案 2 :(得分:0)

我现在能够让它工作,这是因为我没有

[PartCreationPolicy(CreationPolicy.NonShared)]

关于视图的类声明。我在ViewModel上有它。

所以这现在导致了我所期望的行为。

感谢Zabavsky和Alan的建议。