PowerApps で SharePoint Online のリストなどからアプリを作成するとフォームが自動作成されるわけですが、このフォームをカスタマイズしていこうと思うと Parent や ThisItem などの特殊なシンボルが出てきます。なんだか突然出てきますし、その時々で指し示す値も違っているように見えるのでなかなか分かりづらい存在です。

このシンボルがどんなものかを知っておくことが PowerApps アプリの作成やカスタマイズのために必要な気がしましたので、さっそく調べてまとめてみました。

この記事は、僕が PowerApps を学びながら書くシリーズです。

Parent

Parent は文字通り「親」を表すシンボルです。たとえば、フォームに配置されているテキスト ラベルの Text プロパティなどに Parent.Default のようなかたちで設定されています。

Parent を知るためには、このコントロールの親を知る必要があります。PowerApps では、スクリーン上に配置されたコントロールは必ず親子関係を持ちます。その親子関係は、編集画面の左側に表示されている「画面」パネルのツリー構造を見ると明らかです。

この場合、「DataCardValue2」というテキストラベルは「説明_DataCard1」を親に持ち、さらに、「説明_DataCard1」は「DetailForm1」を親に持ち、さらに、「DetailForm1」は「DetailScreen1」を親に持ちます。

つまりは、「DataCardValue2」の Text プロパティに設定されている Parent.Default の値は、親コントロールの Default プロパティを示しているため、親コントロールである「説明_DataCard1」の Default プロパティの値を確認すれば良いことになります。

Parent シンボルを利用するメリットは、親コントロールのプロパティを編集することでその変更が子コントロールにも自動的に反映されることにあります。上手く活用することでメンテナンス性を高く保つことができます。これは、アプリのメンテナンスを引き継ぐ時などに重要となります。

さて、ここで ThisItem が出てきます。つぎに ThisItem について調べてみます。

ThisItem

ThisItem は、ギャラリーコントロールや編集フォームコントロール、ディスプレイフォームコントロールを利用する場合に登場するシンボルです。

たとえばディスプレイフォームコントロールの場合、コントロールに表示されている Item プロパティを見てみましょう。

ここには、BrowseGallery1.Selected が入っています。これは、BrowseGallery1 という名前のギャラリーコントロールに表示されているアイテムの内、クリック(タップ)されたアイテムの情報が設定されていることを表しています。

この時、ディスプレイフォームコントロールの子コントロールに設定された ThisItem はこの値が自動的に反映されます。

たとえば、さきほど確認した「説明_DataCard1」の Default にある ThisItem.説明 は、BrowseGallery1.Selected.説明 と同じ値を持ちます。ThisItem に BrowseGalley1.Selected の値が反映されているためです。

ThisItem を利用するメリットは、繰り返し同じ記述を行うことを減らしたり、ギャラリーコントロール、または、フォームコントロールの再利用性を高めることにあります。フォームに表示するデータを、同じデータ項目を持つ他のギャラリーコントロールで選択されたアイテムに変えたい場合、フォームコントロールの Item プロパティを変更するだけで、子コントロールの ThisItem にも反映されることになります。こちらもアプリのメンテナンス性を高く保つために知っておくべき仕組みになります。

ちなみにギャラリーコントロールの場合は、ギャラリーコントロールの Items プロパティから値が反映されますが、Items プロパティは複数のアイテムを持つテーブルになっています。この場合、子コントロールの ThisItem は、自動的にレコード単位に分割された単一のレコードを示します。

さいごに

PowerApps は簡単にアプリを作成できるサービスですが、それによって上手くアプリを作成したりカスタマイズしたりするためには PowerApps の仕組みやルールを知っておく必要があるように思います。

また、こうした仕組みやルールを利用することで、よりアプリのメンテナンス性を高く保ち、メンテナンスの引き継ぎコストを抑えたり、極端に属人化してしまうことを避けることにも繋がるようにも思います。