Acciones de contexto ViewCell en Android
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:
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:
En este modo, se muestran los elementos del menú de acciones contextuales correctos para la celda 1 y la celda 2.