导航回来时的UWP Restore vielmodel状态

时间:2016-02-20 01:36:39

标签: c# win-universal-app

我试图从我的模型视图(pvm对象)中保存模型(Player类)并在以这种方式导航时恢复它:

 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));在这个构造函数中我设置了保存的Model对象的值,但它不起作用,视图不绑定值。 我该怎么办?

2 个答案:

答案 0 :(得分:0)

您需要检查他们实现INotifyPropertyChanged的viewmodel中的所有属性。并且您的类Player也必须实现此接口。

答案 1 :(得分:0)

据我所知,当你向前导航到页面时(即执行if的{​​{1}}块),绑定工作正常,但是当你向后导航时它不起作用(即执行OnNavigatedTo块)。这意味着问题是由两个代码块之间的不同引起的。

我建议你仔细看看以下内容:

  1. 您只是在else区块中将DataContext设置为pvm。在else区块中,您只需设置if的值,但不会分配给pvm。确切地说DataContext的确切位置以及如何在页面中进一步使用?它与pvm有什么关系?

  2. 在第二种情况下是否正确构造了DataContext?您在每次调用中使用不同的构造函数(在PlayerViewModel块中传递stringPlayerStatus,但在if块中传递Player。还要确保else实例按预期反序列化。

  3. 页面中也可能存在竞争条件。 Player是异步的,不是等待的,因此当您从文件中恢复状态时,页面中的其他代码可能正在运行,但是当您在{{1}中直接实例化OnNavigatedTo时则不会阻止。

    我希望这会有所帮助。在没有看到页面的其余部分和视图模型代码的情况下,很难更精确。