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));在这个构造函数中,我设置了保存的模型对象的值,但它不起作用,视图不绑定值。我能做什么?
您需要
检查视图模型中的所有属性是否都实现了 INotifyPropertyChanged。 并且您的类播放器也必须实现此接口。
据我了解,当您向前导航到页面时(即执行OnNavigatedTo
的if
块),绑定工作正常,但当您向后导航时不起作用(即执行else
块)。这意味着问题是由两个代码块之间的不同内容引起的。
我建议您仔细查看以下内容:
-
您只是将
DataContext
设置为在else
块中pvm
。在if
块中,您只设置pvm
的值,而不分配给DataContext
。pvm
声明的确切位置以及如何在页面中进一步使用它?它与DataContext
有什么关系? -
在第二种情况下,
PlayerViewModel
构造是否正确?您在每次调用中使用不同的构造函数(在if
块中传递string
或PlayerStatus
,但在else
块中传递Player
)。还要确保Player
实例按预期反序列化。
页面中也可能存在争用条件。 OnNavigatedTo
是异步的,不可等待,因此当您从文件还原状态时,页面中的其他代码可能正在运行,但当您直接在 if
块中实例化PlayerViewModel
时,则不会运行。
我希望这有所帮助。如果不看到页面的其余部分和视图模型代码,就很难更精确。