今回はPower Appsのギャラリーコントロールの初期値を変更する方法をご紹介します。
たとえば「ユーザーによって初期選択を変えたい」、「タブバーを再現したギャラリーで真ん中のアイテムをデフォルトにしたい」のような状況で使えます。
Default未指定のときは最初のレコード
Defaultプロパティに何も入力していないときは、 Itemsに指定したテーブルの1番目のレコードになります。
つまり、垂直ギャラリーなら一番上、水平ギャラリーなら一番左が初期選択になります。

最初のレコード以外にしたいとき
最初のレコード以外にしたいときはDefaultプロパティにそのレコードを指定します。
Itemsが複数列テーブルの場合
例として、以下のようなギャラリーコントロールがあります。


このギャラリーの初期値を中央の「ホーム」に設定する場合、Defaultプロパティを以下のようにします。
LookUp(MainTabBarItems, Text = "ホーム")
または
{ Text: "ホーム", Icon: Icon.Home }
Defaultを正しく動作させるにはすべて列が揃ったレコードが必要ですので、基本的にはLookUp
やIndex
で検索した値を使用するのがいいでしょう。
Itemsが単一列テーブルの場合
今度はItemsを単一列テーブルにします。


このなかで「タイムライン」タブを初期値にしたい場合は、Defaultプロパティを以下に設定します。
LookUp(MainTabBarItems, Value = "タイムライン")
または
{ Value: "タイムライン" }
Value
は、[]
で囲った単一列テーブルに自動的に付与される列名です。
また、テーブル値を必要とするタブ一覧やコンボボックスのDefaultSelectedItemsと違い、Defaultの場合は["タイムライン"]
と書くと「レコードが必要です」とエラーになってしまいますので注意しましょう。
再表示時に自動的にDefaultに戻るようにしたいとき
このままだと一番最初にギャラリーが表示されるときは機能しますが、一旦別スクリーンに移動して再度戻ってきた場合には、前回の選択が残ってしまいます。
画面遷移後に選択をDefaultに戻したい場合は、ScreenのOnHiddenプロパティでギャラリーコントロールをリセットしましょう。
Reset(gal_TopTabBar)
ギャラリーのItemsに直接テーブルを入力している場合の注意点
ギャラリーのItemsプロパティは、変数やコレクションを指定できるほか、Itemsプロパティに直接テーブルを書くこともできます。

このとき、Self.AllItems
をLookUp
やIndex
で検索してレコードを指定しようとするとうまくいきません。

なぜなら、AllItems
プロパティはデータソースと、ギャラリーに配置したコントロールを足し合わせたテーブルになっているからです。

このまま使うと余計な列があるため、Itemのレコードと一致していない判定になります。しかも、コントロール以外の条件が一致するレコードはなぜか選択できなくなります。(バグ?)
これを回避するにはレコード自体をハードコード(直接書き込む)か、ShowColumns
またはDropColumns
で必要な列だけに整形してやると表示できるようになります。

複数列テーブルならItemsの外でテーブルを作ったほうがいいかも
単一列テーブルなら{Value: "ホーム"}
のようにハードコードしてしまってもいいと思います。
しかし、直接書く方法だと列数が増えると面倒ですし、何よりも変更に弱くなります。ShowColumns
やRemoveColumns
も余計な演算が増えるだけです。
複数列テーブルの場合は、素直にSet
やUpdateContext
で格納した変数を参照するようにしたほうがいいと思います。
おわりに
ギャラリーコントロールはよく使いますから、今回ご紹介した方法は覚えておいたほうが便利だと思います。
タブ一覧やコンボボックスのDefaultSelectedItemsプロパティの場合は少し違う仕様になっていますので、別途記事にしたいと思います。
コメント