Xamarin.Forms での MVVM の基礎について、通称 Petzold's book の18章「MVVM」をざっくり試しています。
前回の続きです。
Overview
Petzold's bookの内容に沿ってにざっくり進めます。
- 1. MVVM interrelationships(chapter.18 その1)
- MVVMの概要説明
- 時計の表示をMVVMで行うサンプル
- スライダーの値を掛け算するサンプル
- 色の変化を楽しむ?サンプル
- 「ViewModelの簡素化」についてまとめました(...本文を要約)
- ICommandインターフェースの概要
- 3の累乗計算アプリのサンプル
- 簡易足し算アプリのサンプル
Environment
検証した環境は以下で前回同様2016-09-29時点で最新の状態にしています。
- Visual Studio 2015 (Enterprise update3)
- Xamarin.Forms
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.cs
のOnSleep
メソッドから呼ばれるAddingMachinePage
クラス自身のOnSleep
メソッドを定義することもできます。
AddingMachinePage
クラスで、ViewModelのインスタンス化を処理したり、RestoreState
メソッドやSaveState
メソッドを呼ぶ処理をすることもできます。
しかしこのアプローチは、複数ページを持つアプリでは、ぎこちない実装になるかもしれません。
複数ページを持つアプリの場合、ページごとにVeiwModelを分割するかもしれないし、全てのページに適用できるプロパティを持ったViewModelを構成するかもしれません。
そのようなケースでは、それぞれのViewModelの状態を保存するのにdictonaryのkeyがかぶらないようにしないといけないでしょう。
そんな時は、「クラス名-プロパティ名」のようなkeyを指定するとよいでしょう。
といった感じで、18章は終了です。
ここら辺の基礎知識を理解して、より実践的にかつ便利に実装するためにPrismを使って実装することがベストプラクティスかと思います。 Prismは、ここら辺にたくさん情報があります♪