MVVM Tombstoning in WP7

Das Tombstoning ein komplexes Thema ist wissen wir alle, die für WP7 Entwickeln. Noch schlimmer wird es wenn wir MVVM und komplexe Strukturen in unserer APP besitzen. Einen Lösungsansatz hat Colin Eberhardt bei ScottLogic im Blog beschrieben. Er zeigt auf wie man diesem Problem zur Leibe rückt.

Als Beispiel setzt er auf einen Twitter Feed:

Abb. : Ohne Tombstoning mit dem Back Button

Wie man sieht, gehen alle Daten des Feeds verloren und der User wäre verunsichert. Mit folgenden paar Zeilen Sourcecode könnten wir anfangen um den State vom Model zusichern.

private readonly string ModelKey = "Key";

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
  PhoneApplicationService.Current.State[ModelKey] = ViewModel;
}

private void Application_Activated(object sender, ActivatedEventArgs e)
{
  if (PhoneApplicationService.Current.State.ContainsKey(ModelKey))
  {
    ViewModel = PhoneApplicationService.Current.State[ModelKey] as FeedViewModel;
    RootFrame.DataContext = ViewModel;
  }
}

Abb.: Ansatz vom Tombstoning.

Jetzt gehen zumindest die Daten nicht mehr verloren. Der perfekte Weg ist es, die States in einer Datei 
auf dem IsolatedStorage zu speichern und zu laden.

// Code to execute when the application is closing (eg, user hit Back)
// This code will not execute when the application is deactivated
private void Application_Closing(object sender, ClosingEventArgs e)
{
    // persist the data using isolated storage
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    using (var stream = new IsolatedStorageFileStream("data.txt",
                                                    FileMode.Create,
                                                    FileAccess.Write,
                                                    store))
    {
      var serializer = new XmlSerializer(typeof(FeedViewModel));
      serializer.Serialize(stream, ViewModel);
    }
}

// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
  // load the view model from isolated storage
  using (var store = IsolatedStorageFile.GetUserStoreForApplication())
  using (var stream = new IsolatedStorageFileStream("data.txt", FileMode.OpenOrCreate, FileAccess.Read, store))
  using (var reader = new StreamReader(stream))
  {
    if (!reader.EndOfStream)
    {
      var serializer = new XmlSerializer(typeof(FeedViewModel));
      ViewModel = (FeedViewModel)serializer.Deserialize(reader);
    }
  }

  // if the view model is not loaded, create a new one
  if (ViewModel == null)
  {
    ViewModel = new FeedViewModel();
    ViewModel.Update();
  }

  // set the frame DataContext
  RootFrame.DataContext = ViewModel;

Abb.: Tombstoning wie es sein sollte

Quelle:

A Simple Windows Phone 7 MVVM Tombstoning Example
Advertisements

About pocketmobile

Window Phone Developer

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: