BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Xamarin.Forms の MVVM 基礎 ( Petzold's book - chapter.18 FINAL)

Xamarin.Forms での MVVM の基礎について、通称 Petzold's book の18章「MVVM」をざっくり試しています。
前回の続きです。

Overview

Petzold's bookの内容に沿ってにざっくり進めます。

  • 1. MVVM interrelationships(chapter.18 その1
    • MVVMの概要説明
  • 2. ViewModels and data binding(chapter.18 その1
    • 時計の表示をMVVMで行うサンプル
  • Interactive properties in a ViewModel(chapter.18 その2
    • スライダーの値を掛け算するサンプル
  • A Color ViewModel(chapter.18 その2
    • 色の変化を楽しむ?サンプル
  • Streamlining the ViewModel(chapter.18 その3
    • 「ViewModelの簡素化」についてまとめました(...本文を要約)
  • The Command interface 1 (chaptr.18 その4
    • ICommandインターフェースの概要
    • 3の累乗計算アプリのサンプル
  • The Command interface 2(chapter.18 その5
    • 簡易足し算アプリのサンプル
  • ViewModels and the application lifecycle(今回)

Environment

検証した環境は以下で前回同様2016-09-29時点で最新の状態にしています。

ViewModels and the application lifecycle

データの保存と復元

ViewModelにライフサイクルというテーマで、前回の簡易足し算アプリで、以下の機能を実装します。

  • アプリを閉じたりスリープしたときに画面の情報を保存
  • アプリを起動したときに、前回入力していた情報を復元

実装の前に、本文で述べられている概要というか概念をざっくり書いておきます。

ViewModelにライフサイクルを実現するためには、VeiwModelでその状態を保存・復元(リストア)するパブリックなメソッドの定義をすることです。 しかし、ViewModelは、プラットフォームに依存しないようにしなければならないため、プラットフォーム固有のメソッドなどは使うべきではありません。

ということで、
前述を加味したプラクティスとして、IDoctionaryのオブジェクトを使ってにデータを保存・リストアする方法を紹介します。

さっそくコードですが、ViewModelに以下のメソッドを追加します。

RestoreStateメソッドで、dictionayにviewModelのデータを保存します。
SaveStateメソッドでdictonaryにViwModelのデータをリストアします。値がなければ、初期値をセット。

そしてアプリの起動時=App.csで、保存したりリストアしたりすればOKですね。

保存先は、Current。これは、Xamarin.Forms名前空間Application型のオブジェクトです。

これで無事にアプリをSleepさせても再度起動したときにはSleep直前の状態で表示されます。

縦と横の...

本文では、もう1トピック、縦で表示したとき横で表示したときの対応を、コードビハインドで書いているようですね。

15行目のOnPageSizeChangedメソッドです。

まとめ

本文をざっくりざっくり引用します。

今回のサンプルでViewModelを処理する1つの例をみせましたが、これが唯一の方法ではありません。 今回のようにApp.csでViewModelのインスタンス化することも可能ですし、コードビハインドのAddingMachinePage.xaml.csコンストラクターでアクセス可能なViewModelのプロパティを定義することもできます。

AddingMachinePageクラスで、App.csOnSleepメソッドから呼ばれるAddingMachinePageクラス自身のOnSleepメソッドを定義することもできます。 AddingMachinePageクラスで、ViewModelのインスタンス化を処理したり、RestoreStateメソッドやSaveStateメソッドを呼ぶ処理をすることもできます。

しかしこのアプローチは、複数ページを持つアプリでは、ぎこちない実装になるかもしれません。

複数ページを持つアプリの場合、ページごとにVeiwModelを分割するかもしれないし、全てのページに適用できるプロパティを持ったViewModelを構成するかもしれません。
そのようなケースでは、それぞれのViewModelの状態を保存するのにdictonaryのkeyがかぶらないようにしないといけないでしょう。
そんな時は、「クラス名-プロパティ名」のようなkeyを指定するとよいでしょう。

といった感じで、18章は終了です。

ここら辺の基礎知識を理解して、より実践的にかつ便利に実装するためにPrismを使って実装することがベストプラクティスかと思います。 Prismは、ここら辺にたくさん情報があります♪

www.nuits.jp