2016-05-03 1 views
0

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 war
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; 

} 
+0

Erhalten Sie keine Serialisierungsausnahme? – Archana

+0

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. –

+0

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

Antwort

0

Meine Lösung der statischen Schlüsselwörter und behandelt alles im Ansichtsmodell mit dem nach und von OnNavigatedAsync Methoden zu entfernen. Ich erwarte nicht, dass viele Daten bei jedem Start der Anwendung wiederhergestellt werden, und das funktioniert, so unelegant es auch sein mag, es erledigt die Aufgabe.

 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. 
     } 
    }