読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

MVVM な Xamarin.Forms プロジェクトの Model を UnitTest してみる - その1

Xamarin Xamarin.Forms

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

先日 @matatabi_ux さんとお食事に言って色々教えてもらいました。現在の私の Hot Topic は Interface の設計と Unit Test です。

ということで、明後日 2016/9/7(水) の 日本 Android の会 2016年9月定例会「クロスプラットフォーム開発最前線」で Xamarin の話をするのですが、少し UnitTest も含める予定です。

japan-android-group.connpass.com

定員オーバーですが、キャンセルが出るかもしれませんので、気になる方はご登録をお願いいたします。

Xamarin.Forms で MVVM

前回、Xamarin.Android で作った、左に画像、右の上下にテキストを配置する Custom Adapter にボタンをクリックする度にランダムなデータを追加していく。というサンプルのアプリを作りました。Android 開発の方にはなじみ深いコードなのではないかと思います。

ytabuchi.hatenablog.com

今回は同じ動作をするアプリを Xamarin.Forms で MVVM ライクに作ってみました。これを UnitTest してみたいと思います。その1の本エントリーでは、アプリを作るところまでを記載します。

こんな感じで動きます。

f:id:ytabuchi:20160905173240g:plain:w300

Model

(シングルトンにする意味はないんですが。別のページでも使うかもというテイで。)

INotifyPropertyChanged を継承して、public event PropertyChangedEventHandler PropertyChanged; イベントを生やします。

イベントを拾うメソッド

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

も用意します。今回は必要なプロパティが ListView の Binding 対象のコレクションだけなので、ObservableCollection<RamenItem> しか用意していません。また、ObservableCollection は CollectionChanged イベントだけ飛んで PropertyChanged イベントが飛ばない(と聞いた気がする)ので、いつもの変更を取得するゲッターセッターはなしで、単純にゲッターだけにしています。

後は、Items コレクションに追加削除する AddItem()DeleteItem() のメソッドを用意します。このメソッド内で手動で PropertyChanged イベントを発火しています。

そのため、上記メソッドは今回は使いません。(コレクションの数とかをプロパティに持っていれば必要になりますね。)

Model 全体としてはこんな感じです。

gist.github.com

ViewModel と View

VM と View はいつもの通りな感じですが、今回は VM 側で Model のコレクションを操作しないため、VM のプロパティにそのまま Model のコレクションを渡しています。

private ObservableCollection<RamenItem> _items = Ramen.Instance.Items;
public ObservableCollection<RamenItem> Items
{
    get { return _items; }
    set
    {
        if (_items != value)
        {
            _items = value;
            OnPropertyChanged();
        }
    }
}

これで、Model の変更がそのまま VM で処理せずとも自動で View まで反映されます。ModelのPropertyChangedを拾う場合は、VM でコメントしたコードを利用する感じでしょうか。

gist.github.com

サンプルプロジェクト

このサンプルアプリのプロジェクトは以下にアップしました。

github.com

次のエントリーでは このアプリを UnitTest してみたいと思います。こちら。

ytabuchi.hatenablog.com

Xamarin 気になった方は

是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)

ytabuchi.hatenablog.com

Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。

私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。