0

我正在使用带有 UWP 的 Prism 6。我在 MainPage.xaml 中有一个按钮,它重定向到 DashboardPage.xaml。在 DashboardPage 中,我将视图状态保存在 DashboardPage.xaml.cs 中:

protected override void SaveState(Dictionary<string, object> pageState)
        {
            base.SaveState(pageState);

            pageState["viewState"] = 123;
        }

并在 DashboardPageViewModel.cs 中保存视图模型状态:

public override void OnNavigatingFrom(NavigatingFromEventArgs e, Dictionary<string, object> viewModelState, bool suspending)
        {
            base.OnNavigatingFrom(e, viewModelState, suspending);
        }

[RestorableState]
        public string Name
        {
            get { return _name; }
            set { SetProperty(ref _name, value); }
        }

通过按顶部栏中的后退按钮,我回到了 MainPage.xaml。之后,当我再次导航到 DashboardPage.xaml 时,我发现视图状态和视图模型状态为空。这意味着,在下面的 DashboardPage.xaml.cs 代码中

protected override void LoadState(object navigationParameter, Dictionary<string, object> pageState)
        {
            if (pageState == null)
            {
                return;
            }

            base.LoadState(navigationParameter, pageState);

            if (pageState.ContainsKey("viewState"))
            {
                var data = pageState["viewState"].ToString();
            } 
        }

pageState被发现为空。

而且,对于 DashboardPageViewModel.cs 中的视图模型状态:

public async override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState)
        {
            base.OnNavigatedTo(e, viewModelState);
        }

viewModelState为空

4

1 回答 1

2

通过按顶部栏中的后退按钮,我回到了 MainPage.xaml。之后,当我再次导航到 DashboardPage.xaml 时,我发现视图状态和视图模型状态为空。

从您发布的项目中。我发现您使用NavigationService.Navigate导航到DashboardPage。第一次是正确的,但是在您导航回MainPage并再次导航回DashboardPage之后。您也在使用NavigationService.NavigateAPI。

我下载了 Prism 的 Source Codes 并找到了LoadState它的名字:

protected override void OnNavigatedTo(NavigationEventArgs navigationEventArgs)
{
        ...
    if (navigationEventArgs.NavigationMode == NavigationMode.New)
    {
        var nextPageKey = _pageKey;
        int nextPageIndex = frameFacade.BackStackDepth;
        while (frameState.Remove(nextPageKey))
        {
            nextPageIndex++;
            nextPageKey = "Page-" + nextPageIndex;
        }

        // Pass the navigation parameter to the new page
        LoadState(navigationEventArgs.Parameter, null);
    }
    else
    {
        LoadState(navigationEventArgs.Parameter, (Dictionary<String, Object>)frameState[_pageKey]);
    }
}

如您所见,在 NavigationMode 不是 New 的情况下,在LoadState内部调用OnNavigatedToPageState作为参数传递。因为这是类似的情况。对于您的情况,每次导航到一个页面都会创建一个全新的页面,这意味着. 因此 PageState 和 ViewModelState 为空。ViewModelStateNavigationService.NavigateNavigationMode=NavigationMode.New

NavigationMode文档中,我们可以看到NavigationMode.Forward适合您的要求。

所以,要解决问题。唯一需要做的就是OnPageChange在下面的代码中修改方法MainPageViewModel.cs

private void OnPageChange()
{
    if (_navigationService.CanGoForward())
    {
        _navigationService.GoForward();
    }
    else
    {
        _navigationService.Navigate("Dashboard", null);
    }
}
于 2016-05-11T08:35:55.000 回答