Prism导航到模板页面出错

使用Prism导航到一个模板页面,判断标签集合中是否有选中项,没有就添加后打开新的页面,但是点击左边的按钮后只能跳转到第一个标签页,请问这是为什么

img

img

这可能是因为你没有正确设置 Prism 的导航路径。当你使用 Prism 导航到一个模板页面时,它会自动为你创建一个导航路径,该路径由模板页面的唯一标识符组成。这意味着如果你导航到同一个模板页面两次,Prism 将不会创建一个新的页面实例,而是重用现有的实例。

因此,当你点击左边的按钮跳转到第一个标签页时,Prism 导航到了之前创建的模板页面实例,而不是创建一个新的实例。这导致之前添加的标签仍然存在于标签集合中,因此没有创建新的标签页。

为了解决这个问题,你需要使用不同的导航路径来创建每个模板页面的新实例。你可以在导航时将一些参数传递给 Prism,以便为每个实例创建不同的导航路径。例如,你可以添加随机的 GUID 作为参数,以确保每次导航都会创建一个新的实例。

具体来说,你可以像这样导航到模板页面:

var parameters = new NavigationParameters();
parameters.Add("id", Guid.NewGuid().ToString());

_navigationService.Navigate("TemplatePage", parameters);

然后在模板页面中,你可以从导航参数中获取 ID 并将其用作导航路径的一部分:

public TemplatePageViewModel(INavigationService navigationService)
{
    _navigationService = navigationService;

    // 在构造函数中注册导航回调
    NavigationParameters parameters = null;
    _navigationService.Navigated += (sender, e) => parameters = e.Parameters;

    // 判断标签集合中是否有选中项
    if (SelectedIndex < 0)
    {
        // 没有选中项,添加一个新标签
        var id = parameters.GetValue<string>("id");
        var title = "New Tab";
        Tabs.Add(new TabViewModel(id, title, _navigationService));
        SelectedIndex = Tabs.Count - 1;
    }
}

通过这种方式,每次导航都会创建一个新的模板页面实例,并为其分配一个唯一的导航路径。这样,你就可以正确地添加新标签并打开新的页面了。