Ich versuche herauszufinden, wie ObservableCollection-Elemente gespeichert werden, wenn die App geschlossen oder gesperrt ist, und lade sie dann erneut, wenn die App erneut geöffnet wird. Dies ist, was ich habe, aber da die Methoden statisch sind und aus der App.xaml.cs-Datei aufgerufen werden, benötigt die observablecollection MemoryItems eine Referenz. Also verstehe ich nicht wirklich, wie ich die ObservableCollection speichern und aktualisieren kann. Ich habe versucht, eine Instanz des ViewModel in der App.xaml.cs-Datei zu verwenden, aber dann erhalte ich null Elemente in Observablecollection von MemoryItems.Wie kann ich eine ObservableCollection in App Suspend und Start speichern und laden?
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.
}
}
Dann in der App.xaml.cs
Datei warpublic 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;
}
Erhalten Sie keine Serialisierungsausnahme? – Archana
Es wird nicht mit dem statischen Schlüsselwort kompilieren, aber wenn ich zur Verwendung einer Instanz ändern, wird die JSON-Datei erstellt, aber ohne Elemente. –
Ja. Weil eine neue Instanz von viewmodel keine Elemente enthält. Wo wird dein Viewmodel tatsächlich verwendet? Ich meine in welcher Ansichtsseite? Dort solltest du auf Wiederaufnahme und Aussetzung von Ereignissen warten. – Archana