[英]How to save ObservableCollection in Windows Store App?
[英]How to save and load an observablecollection on app suspend and start?
我试图弄清楚在关闭或暂停应用程序时如何保存可观察的收藏项目,然后在再次打开应用程序时重新加载它们。 这就是我所拥有的,但是因为方法是静态的,并且正在从App.xaml.cs文件中调用,所以MemoryItems observablecollection需要引用。 因此,我不太了解如何保存和更新可观察的集合。 我试图在App.xaml.cs文件中使用ViewModel的实例,但随后在MemoryItems observablecollection中获得了零项。
public ObservableCollection<MemoryItem> MemoryItems { get; set; } = new ObservableCollection<MemoryItem>();
public MainPageViewModel()
{
}
public string MemoryValue
{
get
{
return _memoryValue;
}
set
{
_memoryValue = value;
OnPropertyChanged("MemoryValue");
}
}
public static async Task Serializer()
{
var folder = ApplicationData.Current.RoamingFolder;
var file = await folder.CreateFileAsync("collection.json", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
using (var writer = new StreamWriter(stream, Encoding.UTF8))
{
string json = JsonConvert.SerializeObject(MemoryItems);
await writer.WriteAsync(json);
}
}
public static async Task Deserializer()
{
try
{
var folder = ApplicationData.Current.RoamingFolder;
var file = await folder.GetFileAsync("collection.json");
using (var stream = await file.OpenStreamForReadAsync())
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
string json = await reader.ReadToEndAsync();
MemoryItems = JsonConvert.DeserializeObject<ObservableCollection<MemoryItem>>(json);
}
}
catch (Exception)
{
// Handle Exception.
}
}
然后在App.xaml.cs文件中
public async void OnSuspending(object sender, SuspendingEventArgs args)
{
SuspendingDeferral deferral = args.SuspendingOperation.GetDeferral();
await MainPageViewModel.Serializer();
deferral.Complete();
}
public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args)
{
NavigationService.Navigate(typeof(Views.MainPage));
await MainPageViewModel.Deserializer();
await Task.CompletedTask;
}
我的解决方案是使用To和From OnNavigatedAsync方法删除静态关键字并处理viewmodel中的所有内容。 我预计应用程序每次启动时都不会还原很多数据,而且这种方法正在起作用,因此尽管它可能很微不足道,但它可以完成工作。
private bool newPage = true;
public override async Task OnNavigatedFromAsync(IDictionary<string, object> suspensionState, bool suspending)
{
await Serializer();
}
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state)
{
if (newPage == true)
{
await Deserializer();
newPage = false;
}
}
public async Task Serializer()
{
var folder = ApplicationData.Current.RoamingFolder;
var file = await folder.CreateFileAsync("collection.json", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
using (var writer = new StreamWriter(stream, Encoding.UTF8))
{
string json = JsonConvert.SerializeObject(MemoryItems);
await writer.WriteAsync(json);
}
}
public async Task Deserializer()
{
try
{
var folder = ApplicationData.Current.RoamingFolder;
var file = await folder.GetFileAsync("collection.json");
using (var stream = await file.OpenStreamForReadAsync())
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
var json = await reader.ReadToEndAsync();
ObservableCollection<MemoryItem> MemoryItems = JsonConvert.DeserializeObject<ObservableCollection<MemoryItem>>(json);
if(MemoryItems.Count != 0)
{
foreach (var item in MemoryItems)
{
var sb = new StringBuilder();
sb.Append(item.Memory);
var fileString = sb.ToString();
var memoryItem = new MemoryItem
{
Memory = fileString
};
this.MemoryItems.Add(memoryItem);
}
}
else
{
Memory();
}
}
}
catch (Exception)
{
// Handle Exception.
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.