UWP 在向后导航时还原 vielmodel 状态

本文关键字:还原 vielmodel 状态 导航 UWP | 更新日期: 2023-09-27 18:35:30

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

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

UWP 在向后导航时还原 vielmodel 状态

您需要

检查视图模型中的所有属性是否都实现了 INotifyPropertyChanged。 并且您的类播放器也必须实现此接口。

据我了解,当您向前导航到页面时(即执行OnNavigatedToif块),绑定工作正常,但当您向后导航时不起作用(即执行else块)。这意味着问题是由两个代码块之间的不同内容引起的。

我建议您仔细查看以下内容:

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

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

页面中也可能存在争用条件。 OnNavigatedTo是异步的,不可等待,因此当您从文件还原状态时,页面中的其他代码可能正在运行,但当您直接在 if 块中实例化PlayerViewModel时,则不会运行。

我希望这有所帮助。如果不看到页面的其余部分和视图模型代码,就很难更精确。