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