pageState и viewModelState имеют значение NULL при переходе по странице в UWP

Я использую Prism 6 с UWP. У меня есть кнопка в 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, я обнаружил, что состояния представления и состояния модели представления имеют значение null. Это означает, что в приведенном ниже коде 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 имеет значение null.

И для просмотра состояния модели в DashboardPageViewModel.cs:

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

viewModelState имеет значение null


person Yeasin Abedin Siam    schedule 09.05.2016    source источник
comment
Не могли бы вы поделиться базовым демонстрационным проектом, который может воспроизвести эту проблему?   -  person Elvis Xia - MSFT    schedule 10.05.2016
comment
да, конечно, я загрузил его здесь   -  person Yeasin Abedin Siam    schedule 10.05.2016


Ответы (1)


Нажав кнопку «Назад» на верхней панели, я вернулся к MainPage.xaml. После этого, когда я снова перехожу к DashboardPage.xaml, я обнаружил, что состояния представления и состояния модели представления имеют значение null.

Из вашего опубликованного проекта. Я обнаружил, что вы используете NavigationService.Navigate для перехода к DashboardPage. Это правильно в первый раз, но после того, как вы вернетесь на MainPage и снова вернетесь на DashboardPage. Вы также используете NavigationService.Navigate API.

Я скачал исходные коды Prism и нашел, где 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]);
    }
}

Как видите, LoadState вызывается внутри OnNavigatedTo, а PageState передается в качестве аргумента при условии, что NavigationMode не является новым. Для ViewModelState аналогичная ситуация. И в вашем случае каждый раз при переходе на страницу через NavigationService.Navigate будет создаваться совершенно новая страница, что означает NavigationMode=NavigationMode.New. Следовательно, PageState и ViewModelState имеют значение null.

Из документа NavigationMode мы можете видеть, что NavigationMode.Forward соответствует вашим требованиям.

Итак, для решения проблемы. Единственное, что нужно сделать, это изменить метод OnPageChange в MainPageViewModel.cs, как показано ниже:

private void OnPageChange()
{
    if (_navigationService.CanGoForward())
    {
        _navigationService.GoForward();
    }
    else
    {
        _navigationService.Navigate("Dashboard", null);
    }
}
person Elvis Xia - MSFT    schedule 11.05.2016