2016-02-20 2 views
0

Я пытаюсь сохранить модель (класс игрока) из моего видовую (PVM объекта) и восстановить его, когда вернуться обратно так:UWP Восстановление vielmodel состояние при навигации назад

protected async override void OnNavigatedFrom(NavigationEventArgs e) 
    { 

     base.OnNavigatedFrom(e); 
     StorageFolder folder = ApplicationData.Current.LocalFolder;//abre pasta do app 
     StorageFile jsonFile = await folder.CreateFileAsync("PlayerSaveState", Windows.Storage.CreationCollisionOption.ReplaceExisting);//cria/substitui arquivo 

     await FileIO.WriteTextAsync(jsonFile, JsonConvert.SerializeObject(pvm.Player));   

и

protected async override void OnNavigatedTo(NavigationEventArgs e) { 

     if (e.NavigationMode != NavigationMode.Back) { 
      if (e.Parameter is string) 
      { 
       pvm = new PlayerViewModel(e.Parameter as string); //defalt constructor 
      } 
      else 
       pvm = new PlayerViewModel(e.Parameter as PlayerStatus); 
     } 
     else 
     { 
      StorageFolder folder = ApplicationData.Current.LocalFolder; 
      StorageFile jsonFile = await folder.GetFileAsync("PlayerSaveState"); 
      String json = await FileIO.ReadTextAsync(jsonFile); 
      pvm = new PlayerViewModel(JsonConvert.DeserializeObject<Player>(json)); 
      DataContext = pvm; 
     } 
    } 

PlayerViewModel (JsonConvert.DeserializeObject (json)); в этом конструкторе я устанавливаю значение сохраненного объекта модели, но оно не работает, представление не связывает значения. Что мне делать?

ответ

0

вам нужно проверить, все ли ваши свойства в области просмотра реализованы в INotifyPropertyChanged. и ваш класс Player также должен реализовать этот интерфейс.

0

Как я понимаю, вяжущие хорошо работает, когда вы переходите вперед к странице (т.е. if блок OnNavigatedTo выполнен), но не работает, когда вы ориентируетесь назад (то есть else блок выполнен). Это означает, что проблема вызвана тем, что отличается от обоих блоков кода.

Я предлагаю вам внимательно посмотреть на следующее:

  1. Вы только установка DataContext к pvm в else блоке. В блоке if вы устанавливаете значение pvm, но не назначаете DataContext. Где именно указано pvm и как оно будет использоваться на странице? Как это связано с DataContext?

  2. Действительно ли PlayerViewModel правильно построен во втором корпусе? Вы используете разные конструкторы в каждом вызове (передача string или PlayerStatus в блоке if, но Player в блоке else). Также убедитесь, что экземпляр Player десериализуется, как ожидалось.

Существует также возможность расы на странице. OnNavigatedTo является асинхронным и не ожидаемым, поэтому другой код на странице может работать при восстановлении состояния из файла, но не тогда, когда вы непосредственно создаете PlayerViewModel в блоке if.

Надеюсь, это поможет. Не видя остальной части страницы и кода модели представления, трудно быть более точным.

Смежные вопросы