1

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

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

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

这是视图模型的示例:

[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(请求同一视图的另一个实例)时,回调报告错误“视图已存在于区域中”。因此,似乎我可以在一个区域中拥有多个不同视图的实例,但不能拥有同一视图的多个实例。我对此的理解不是很好,所以我可能是错的。

4

3 回答 3

0

当您想要创建一个新视图时,为什么不创建视图?在我看来,您正在使用 MEF。

  1. 使用容器来解析视图的新实例
  2. 将视图的新实例添加到 MainRegion
  3. 然后调用 Navigate 并在 IsNavigationTarget 中处理相应的逻辑
于 2012-10-17T04:01:49.437 回答
0

您应该[Export]在视图中使用带有合同名称的属性:[Export("DataEntryPageView")].

于 2012-10-17T07:48:51.763 回答
0

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

[PartCreationPolicy(CreationPolicy.NonShared)]

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

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

感谢 Zabavsky 和 ​​Alan 的建议。

于 2012-10-17T08:55:39.280 回答