Xamarin.Forms でアプリの設定情報を保存するには (Properties Dictionary 使用)


こんにちは。エクセルソフトの田淵です。

> 本記事は [Xamarin.Forms でアプリの設定情報を保存するには (Properties Dictionary 使用) - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2015/07/06/181357) の転載記事です。

アプリの設定情報は皆さん色んな方法で格納していると思いますが、Xamarin.Forms には標準で `Properties Dictionary` という Dictionary が用意されていて、そこにデータをぶっこめば適宜保存してくれます。

> 2015/7/6 時点の最新版、[Xamarin.Forms 1.4.3.6374](https://www.nuget.org/packages/Xamarin.Forms/) で確認しています。

Xamarin.iOS, Xamarin.Android それぞれで設定情報を保存する場合は、[Xamarin.iOS／Androidでアプリの設定情報を保存するには？ - Build Insider](http://www.buildinsider.net/mobile/xamarintips/0030) をご覧ください。

> [Json.NET を使用して設定情報を保存する場合はこちら](http://ytabuchi.hatenablog.com/entry/2015/07/06/192526)


## サンプル

[ｷﾞｯﾊﾌﾞ](https://github.com/ytabuchi/Study/tree/master/XF_DataSaveSample)

画面写真

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150706/20150706181103.png" width="150" /> <img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150706/20150706181107.png" width="150" />

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150706/20150706181116.png" width="150" /> <img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150706/20150706181058.png" width="150" />

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150706/20150706181112.png" width="150" /> <img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150706/20150706181114.png" width="150" />



# Properties Dictionary を使う

[Working with the App Lifecycle - Xamarin](http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/app-lifecycle/#Properties_Dictionary)

にあるように、

保存：

```csharp
Application.Current.Properties ["id"] = someClass.ID;
```

復元：

```csharp
if (Application.Current.Properties.ContainsKey("id"))
{
    var id = Application.Current.Properties ["id"] as int;
    // do something with id
}
```

だけです。

しっかりやる場合には、id:matatabi_ux さんの

[Xamarin.Forms でセッションデータを保存・復元したい - しっぽを追いかけて](http://matatabi-ux.hateblo.jp/entry/2015/03/20/120000)

をご参照ください(私には難しいです…)。なお、Windows Phone のセッションデータが保持できない。とありますが、現在の 1.4.3.6374 では修正されています。ﾌﾞﾗﾎﾞｰ!!

# やり方

string Name, DateTime Birthday, bool Like の 3つのデータを保存したいと思います。

## [コントロールの値を直に参照する](https://github.com/ytabuchi/Study/blob/master/XF_DataSaveSample/XF_DataSaveSample/XF_DataSaveSample/Views/SaveToDictionaryCS.cs)

例えば C# で (これは Xaml では作ってません。すみません。) ベタにやるとこんな感じです。

コントロール：

```csharp
var entryName = new Entry { Placeholder = "Input your name", };
var pickerBirthday = new DatePicker { Date = new DateTime(1990, 1, 1) };
var switchLike = new Switch { };
var saveButton = new Button { Text = "Save" }
var loadButton = new Button { Text = "Load" }
var clearButton = new Button { Text = "Clear" } 
```

保存：

```csharp
var name = entryName.Text;
var birth = pickerBirthday.Date;
var like = switchLike.IsToggled;
Application.Current.Properties["name"] = name;
Application.Current.Properties["birth"] = birth;
Application.Current.Properties["like"] = like;
```

復元：

```csharp
if (Application.Current.Properties.ContainsKey("name"))
{
    var name = (string)Application.Current.Properties["name"];
    var birth = (DateTime)Application.Current.Properties["birth"];
    var like = (bool)Application.Current.Properties["like"];

    entryName.Text = name;
    pickerBirthday.Date = birth;
    switchLike.IsToggled = like;
}
```

削除：

```csharp
Application.Current.Properties.Clear();
```

かなり面倒ですね！保存したい値が多いと更に大変そうですｗ



## ViewModel 経由で参照する ( [C#](https://github.com/ytabuchi/Study/blob/master/XF_DataSaveSample/XF_DataSaveSample/XF_DataSaveSample/Views/SaveByVMCS.cs) )

[INotifyPropertyChanged な ViewModel](https://github.com/ytabuchi/Study/blob/master/XF_DataSaveSample/XF_DataSaveSample/XF_DataSaveSample/ViewModels/AllPagesViewModel.cs) を用意します。

`AllPagesViewModel vm = new AllPagesViewModel();` でインスタンス化しておいて、Binding を指定します。(インスタンス化しないといけないのか？は良く分かっていません… 詳しい方教えてください…)

```csharp
var entryName = new Entry { Placeholder = "Input your name" };
entryName.SetBinding(Entry.TextProperty, "Name", mode: BindingMode.TwoWay);

var pickerBirthday = new DatePicker { };
pickerBirthday.SetBinding(DatePicker.DateProperty, "Birthday", mode: BindingMode.TwoWay);

var switchLike = new Switch { };
switchLike.SetBinding(Switch.IsToggledProperty, "Like", mode: BindingMode.TwoWay);

```

で、

保存：

```csharp
Application.Current.Properties["name"] = vm.Name;
Application.Current.Properties["birth"] = vm.Birthday;
Application.Current.Properties["like"] = vm.Like;
```

復元：

```csharp
if (Application.Current.Properties.ContainsKey("name"))
{
    vm.Name = (string)Application.Current.Properties["name"];
    vm.Birthday = (DateTime)Application.Current.Properties["birth"];
    vm.Like = (bool)Application.Current.Properties["like"];
}
```

としてあげれば良いですね。削除は同じです。TwoWay なのでコントロールを手動で書き換える必要もなく、少しだけ楽になりました。


## ViewModel 経由で参照する ( [Xaml](https://github.com/ytabuchi/Study/blob/master/XF_DataSaveSample/XF_DataSaveSample/XF_DataSaveSample/Views/SaveByVMXaml.xaml) / [xaml.cs](https://github.com/ytabuchi/Study/blob/master/XF_DataSaveSample/XF_DataSaveSample/XF_DataSaveSample/Views/SaveByVMXaml.xaml.cs) )

Xaml でも同じです。Binding がさっくり書けるので Xaml の方が更に楽かもしれません。

Xaml：

```xml
<Entry Text="{Binding Name, Mode=TwoWay}" Placeholder="Input your name" />
<DatePicker Date="{Binding Birthday, Mode=TwoWay}" />
<Switch IsToggled="{Binding Like, Mode=TwoWay}" />
```

コードビハインドは C# と同じです。


まずは、Properties Dictionary を使用する方法をご紹介しました。こういう簡単なことが簡単にできるように用意されているのは嬉しいですね。次はひと手間かけて Json.NET で設定を Json に保存してみたいと思います。

# Xamarin 気になった方は

是非 [ダウンロード(直接)](http://xamarin.com/download) / [ダウンロード(弊社経由)](https://www.xlsoft.com/jp/products/download/index.html?option=Xamarin&r=ythb) して触ってみてください。
[学習用リソース](http://ytabuchi.hatenablog.com/entry/2014/08/26/191759) や [JXUG リンクページ](http://jxug.org/links.html) に参考資料を纏めてますので併せてどうぞ。

<a href="http://blog.hatena.ne.jp/ytabuchi/ytabuchi.hatenablog.com/subscribe">Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。</a>

以上です。