[英]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.