Share via


Android での ViewCell コンテキスト アクション

Xamarin.Forms 4.3 から既定として、Android アプリケーション内の ViewCellListView 内の各項目のコンテキスト アクションを定義している場合、コンテキスト アクション メニューは、ListView 内の選択された項目が変化したときに更新されます。 しかし、Xamarin.Forms の以前のバージョンでは、コンテキスト アクション メニューは更新されず、この動作は ViewCell レガシ モードと呼ばれます。 ListView がさまざまなコンテキスト アクションを定義する DataTemplate オブジェクトから自身の ItemTemplate を設定するために DataTemplateSelector を使用する場合、このレガシ モードは正しくない動作を引き起こす可能性があります。

この Android プラットフォーム固有設定では、後方互換対応のために ViewCell コンテキスト アクション メニューのレガシ モードを有効にして、ListView 内の選択された項目が変化したときにコンテキスト アクション メニューが更新されないようにできます。 この機能を XAML で使用するには、バインド可能なプロパティ ViewCell.IsContextActionsLegacyModeEnabledtrue に設定します。

<ContentPage ...
             xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core">
    <StackLayout Margin="20">
        <ListView ItemsSource="{Binding Items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell android:ViewCell.IsContextActionsLegacyModeEnabled="true">
                        <ViewCell.ContextActions>
                            <MenuItem Text="{Binding Item1Text}" />
                            <MenuItem Text="{Binding Item2Text}" />
                        </ViewCell.ContextActions>
                        <Label Text="{Binding Text}" />
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

あるいは、Fluent API を使用して C# から使用することもできます。

using Xamarin.Forms.PlatformConfiguration;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
...

viewCell.On<Android>().SetIsContextActionsLegacyModeEnabled(true);

ViewCell.On<Android> メソッドは、このプラットフォーム固有設定が Android 上でのみ実行されるように指定します。 Xamarin.Forms.PlatformConfiguration.AndroidSpecific 名前空間内の ViewCell.SetIsContextActionsLegacyModeEnabled メソッドは、ListView 内の選択された項目が変化したときにコンテキスト アクション メニューが更新されないようにするために、ViewCell コンテキスト アクション メニューのレガシ モードを有効にするために使用されます。 さらに、ViewCell.GetIsContextActionsLegacyModeEnabled メソッドを使用して、コンテキスト アクションのレガシ モードが有効になっているかどうかを返すことができます。

次のスクリーンショットは、ViewCell コンテキスト アクションのレガシ モードが有効になっていることを示しています。

Android 上の有効になっている ViewCell レガシ モードのスクリーンショット

このモードでは、セル 2 に対しては異なるコンテキスト メニュー項目が定義されているにもかかわらず、表示されるコンテキスト アクション メニュー項目はセル 1 とセル 2 で同じです。

次のスクリーンショットは、ViewCell コンテキスト アクションのレガシ モードが無効になっていることを示しています。これは Xamarin.Forms の既定の動作です。

Android 上の無効になっている ViewCell レガシ モードのスクリーンショット

このモードでは、セル 1 とセル 2 に対して適切なコンテキスト アクション メニュー項目が表示されます。