プログラミングの知識が無くてもアプリが作れる PowerApps を試してみた(3)

[前回の記事](http://qiita.com/IKETA/items/f9bf8b461b1981906ef3) では、PowerApps Studio を使用して、テンプレートからアプリの作成を行った。本稿からは、アプリの構成や仕組みなどを確認していく。

# アプリの開発画面を開く
前回作成した Asset Checkout アプリの開発画面を PowerApps Studio で開く。[開く] メニューから、前回作成したアプリの ![image](https://qiita-image-store.s3.amazonaws.com/0/153436/fc4987ac-0770-0795-0550-3b61e56890a3.png) をクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/a3cfe62a-91d4-e38c-8940-98d3a148ea82.png)

開発画面が開くので、まずはこの画面の構成をおさえておく。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/c7f62609-4850-00f9-b8f7-140651c00f0a.png)

## (1) 左ペイン（ウィンドウ）
このアプリで使用する画面のリストが表示される。ここから、編集したい画面を選択する。
## (2) 中ペイン
ここには、左ペインから選択した画面が大きく表示される。画面へのテキストボックスやボタンなどのコントロールの配置や、レイアウトの調整を行う。
## (3) 右ペイン
ここでは、コントロールのデザイン（大きさ、色などのプロパティ）や、アクション（クリックしたときにどうなるか？などのイベント）を決定する。コントロールは、配置しただけでは "ただのオブジェクト" なので、アクションを指定して何かしらの振る舞いを持たせないといけない。この他にも、データソースとの紐付けもここで行う。
※(3)´ のツールバーでも、同じ操作が行える。


# コントロールについて理解する
アプリの画面を構成するのは複数のコントロールである。また、アクションを起こしたり、データ連携するのもコントロールであるので、このコントロールを中心に色々と調べてみた。
PowerApps で扱うことのできるコントロールはたくさんあるが、ここでは『画像ギャラリー』というコントロールを例に上げて、まとめてみようと思う。『画像ギャラリー』とは、一言で言うと、画像をリスト表示するためのコントロールである。
※コントロールの種類については、以下のサイトの Add a control の章を参考。
https://powerapps.microsoft.com/ja-jp/tutorials/add-configure-controls/

## デザイン
まずは左ペインから HomeScreen の画面を選択する。中ペインに表示される画面レイアウトの下部にある「四角の 4 つのボックスをとりまとめているもの」が『画像ギャラリー』なので、これを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/6ab5213e-a65e-d3fe-dbc1-fa22bf810134.png)

このコントロールの名前は "CategoriesGallery" となっている。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/66959985-aa12-3350-0753-d674631e0c86.png)

### 位置や大きさなどの変更
コントロールの位置や大きさを変更するのは簡単にできる。中ペインで対象のコントロールを選択した後、選択領域をドラッグして移動したり、選択領域の端にある〇をドラッグして大きさを変更するだけだ。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/65b16a7b-db8f-f789-9b39-295c048b9787.png)

または、右ペインのデザインから、TemplateSize などのプロパティの数値を変更すればよい。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/1984a6d9-63ab-8345-da93-2a6998eb91b7.png)

### リストアイテムの選択
『画像ギャラリー』は、画像をリスト表示するコントロールであり、リストアイテムもコントロールの集まりで構成される。CategoriesGallery のリストアイテムは、『四角形アイコン』『画像』『テキストボックス』のコントロールで構成されている。これらのコントロールを選択するには、最初のリストアイテムをクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/622baf52-c97b-3b0a-eeea-3968aa8f366b.png)

なお、CategoriesGarelly では、四角形アイコンが画像やテキストボックスに覆いかぶさっており、画像とテキストボックスを選択することができない。この場合は、右ペインのコントロール一覧から、まず "CategoriesGarelly" を選択する。すると、リストアイテムのコントロールも表示されるのようになるので、そこから選択することができる。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/9edd0b9f-716f-d9ed-fc28-2cf281093a23.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/8c9ce31e-f0eb-5795-b45a-3073dbd88ffb.png)

これで、リストアイテムのデザインも可能になる。以下は、リストアイテムのテキストボックスの色を青色に変更したところ。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/fa0f4d0b-de4d-1c71-49f6-a74cefc595b2.png)


## データバインディング
PowerApps は、データソースとの接続の容易さを特徴のひとつとしてあげている。データソースとコントロールを紐付けることにより、例えば、「コントロールのテキストの値に、データソースの ある列 の値を表示させる」といった GUI とデータの結合が簡単にできるようになるようだ。

それでは、CategoriedGallery のデータバインディングについて確認してみよう。右ペインのデータの Items に注目する。この値は "Categories" となっているが、「"Categories" という名前のデータソースを元に、CategoriesGallery のリストアイテムを生成する」ことが想像できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/03661f0c-24a0-9354-72b9-b184fdd10c36.png)

実際に "Categories" がどのようなデータなのかを確認してみる。データソースは OneDrive（の Excel ファイル）を指定したので OneDrive を開く。
パス PowerApps/Templates/AssetsCheckout_xxxx（xxxx はランダムな UUID と思われる）に Excel ファイルがあるので、参照する。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/f68da884-2721-9d67-7786-f0df22f85e04.png)

data.xlsx を開いたところ。シート 1 つがテーブル 1 つを表しているようだ。Categories シートには以下のように 4 行のデータが記録されている。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/5ebbc1dd-49e2-9de8-bd98-348d1cff46b0.png)

改めて CategoriesGallery を確認してみよう。Categories シートの CategoryName 列の値が、それぞれリストアイテム内のテキストボックスに表示されていることがわかる。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/024be2c9-3608-0830-f036-0fe7299340fa.png)

これで、CategoriesGallery コントロールと、データソースの Categories シートが紐づけられていることがハッキリした。
それではなぜ、CategoryName 列の値が、リストアイテムのテキストとして表示されるのか？
この設定は [オプション] から行うことができた。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/cffe964d-c0a6-f77a-1ec8-baa0640a950e.png)

CategoryName と表示されているリストボックスをクリックすると、中ペインでは、リストアイテム内のテキストボックスが選択されることがわかる。つまり、「CategoryName 列の値を、このボックス内のテキストに表示せよ」という設定であると理解できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/a396cc9b-d687-441c-0e08-7c9d9aaec73f.png)

試しに、列の値を "CategoryId" に変えてみよう。すると、ボックス内のテキストが、CategoryId 列の値に変わった。
![image](https://qiita-image-store.s3.amazonaws.com/0/153436/91297cff-31bb-a10c-4ba6-7813d0888b3f.png)

以上が、データバインディングの仕組みである。なお、ボックス内の画像（の URL）も Categories シートから取得しており、CategoryImage 列とデータバインドしている。


# まとめ
今回は、コントロールのデザインレイアウトの操作性とデータバインディングについて確認した。筆者はデザイナーではないので、デザインに関しては実はあまりよくわからないのだが、データ連携に関してはシンプルでわかり易く、普段から C# でコードを書いている身としても なかなかしっくりくるものがあった。
次回は、コントロールのアクションについて記載したいと思う。


# 参考文献
Add and configure a control in PowerApps
https://powerapps.microsoft.com/ja-jp/tutorials/add-configure-controls/

Show a list of items in PowerApps
https://powerapps.microsoft.com/ja-jp/tutorials/add-gallery/