/xamarin-lifegame-xaml

以前作ったxamarin-lifegameをXAMLで作り直したものです。

Primary LanguageC#MIT LicenseMIT

ライフゲーム with XAML.

以前 Xamarin のコードだけで作ったライフゲームのリメイク版です。
今回は XAMLPrism.Forms を使っています

各種バージョン

ライブラリ バージョン
Xamarin.Forms 2.3.3.180
Prism.Core 6.3.0-pre2
Prism.Forms 6.3.0-pre2
Prism.Unity.Forms 6.3.0-pre2

前回との変更点

ViewにXAMLを使った

GridButton のレイアウトの設定は、XAML でやりました。
コードでやると動かすまでイマイチコンポーネントを配置しているのをイメージしにくかったですけど、
XAML を使うことで動かすまえでもある程度レイアウトをイメージしやすかったです。
ただ、Grid 上に置くたくさんの Cell 達を XAML で実現しようとすると力技になって色々大変だったので、 そこだけはコード上で行いました。

PrismでMVVM

ButtonCell のイベントハンドラの作成や、ライフゲームの処理の部分を ViewModel に記述しました。
イベントハンドラは、DelegateCommand を用いることで、クリックできる/できない状態を制御し、より操作しやすいように変更できました。
Button は後から Image に変更しました。 Image はそのままだとクリックできる時とできない時で見た目が変わらないので、
状態によって表示するファイルを変更することでクリック可能なときが分かるようにしました。
PrismBindableBase にある SetProperty を使うことで、 ViewModel 側の変更を View に通知することができました。

得られたこと

XAMLとコードビハインドの共存の重要性

どちらにも得手不得手があるので、うまく両方を使うとハッピーになると思います。
基本的に ViewXAML で作成するけど、繰り返しが必要なものや設定にちょっと処理が必要なものについては、 コードビハインド側で作成・配置を行った方がよいなと思いました。

DelegateCommandの使い方

DelegateCommand は、型パラメータのあり/なしでちょっとだけ書き方が変わり、型パラメータありの場合は CommandParameter での値の受け渡しが可能でした。
ただ、値の受け渡し時に指定する型は、Nullable (Null許容)じゃないといけなくて、
int を指定したら起動時にエラーになり、int? に変更すると大丈夫でした。

参考にしたもの

ページ 内容
chomado/Xamalist Prismの実装(特にDelegateCommand)
nuits.jp blog Prism関連のトラブルシューティング
かずきのBlog@hatena XAMLの実装