Acciones de contexto ViewCell en Android

Download SampleDescargar el ejemplo

De forma predeterminada, a partir de Xamarin.Forms 4.3, cuando una clase ViewCell en una aplicación Android define acciones contextuales para cada elemento de un objeto ListView, el menú de acciones contextuales se actualiza cada vez que cambia el elemento seleccionado en ListView. Sin embargo, en versiones anteriores de Xamarin.Forms, el menú de acciones contextuales no se actualizaba, y este comportamiento se conoce como el modo heredado de ViewCell. Este modo heredado puede dar lugar a un comportamiento incorrecto si ListView usa un DataTemplateSelector para establecer su ItemTemplate a partir de objetos DataTemplate que definen diferentes acciones contextuales.

Esta funcionalidad específica de la plataforma Android habilita el modo heredado del menú de acciones contextuales de ViewCell para la compatibilidad con versiones anteriores, de modo que el menú de acciones contextuales no se actualiza cuando cambia el elemento seleccionado en un objeto ListView. Se consume en XAML estableciendo la propiedad ViewCell.IsContextActionsLegacyModeEnabled enlazable en true:

<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>

Como alternativa, se puede consumir desde C# mediante la API fluida:

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

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

El método ViewCell.On<Android> especifica que esta plataforma específica solo se ejecutará en Android. El método ViewCell.SetIsContextActionsLegacyModeEnabled en el espacio de nombres Xamarin.Forms.PlatformConfiguration.AndroidSpecific se usa para habilitar el modo heredado del menú de acciones contextuales de ViewCell, por lo que el menú de acciones contextuales no se actualiza cuando cambia el elemento seleccionado en un objeto ListView. Además, el método ViewCell.GetIsContextActionsLegacyModeEnabled se puede usar para devolver información sobre si el modo heredado de acciones contextuales está habilitado o no.

Las capturas de pantalla siguientes muestran el modo heredado de acciones contextuales de ViewCell habilitado:

Screenshot of ViewCell legacy mode enabled, on Android

En este modo, los elementos del menú de acciones contextuales que se muestran son idénticos para la celda 1 y la celda 2, a pesar de que se definen diferentes elementos de menú contextual para la celda 2.

En las capturas de pantalla siguientes se muestra el modo heredado de acciones contextuales de ViewCell deshabilitado, que es el comportamiento predeterminado en Xamarin.Forms:

Screenshot of ViewCell legacy mode disabled, on Android

En este modo, se muestran los elementos del menú de acciones contextuales correctos para la celda 1 y la celda 2.