ViewCell-Kontextaktionen unter Android
Wenn ein ViewCell
in einer Android-Anwendung Kontextaktionen für jedes Element in einem ListView
definiert, wird das Kontextmenü standardmäßig von Xamarin.Forms Version 4.3 aktualisiert, wenn sich das ausgewählte Element in der ListView
Anwendung ändert. In früheren Versionen des Xamarin.Forms Kontextmenüs wurde jedoch nicht aktualisiert, und dieses Verhalten wird als ViewCell
Legacymodus bezeichnet. Dieser Legacymodus kann zu falschem Verhalten führen, wenn ein ListView
ein DataTemplateSelector
verwendet, um seine ItemTemplate
von DataTemplate
-Objekten festzulegen, die unterschiedliche Kontextaktionen definieren.
Dieser Android-plattformspezifische Aktiviert den Legacymodus des ViewCell
Kontextmenümenüs aus Gründen der Abwärtskompatibilität, sodass das Kontextmenüaktionsmenü nicht aktualisiert wird, wenn sich das ausgewählte Element in einem ListView
ändert. Es wird in XAML verwendet, indem die ViewCell.IsContextActionsLegacyModeEnabled
bindbare Eigenschaft auf true
festgelegt wird:
<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>
Alternativ kann sie über C# mit der Fluent-API genutzt werden:
using Xamarin.Forms.PlatformConfiguration;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
...
viewCell.On<Android>().SetIsContextActionsLegacyModeEnabled(true);
Die ViewCell.On<Android>
-Methode gibt an, dass diese plattformspezifische Version nur unter Android ausgeführt wird. Die ViewCell.SetIsContextActionsLegacyModeEnabled
-Methode im Xamarin.Forms.PlatformConfiguration.AndroidSpecific
Namespace wird verwendet, um den Legacymodus des ViewCell
Kontextmenüs zu aktivieren, sodass das Kontextmenüaktionenmenü nicht aktualisiert wird, wenn sich das ausgewählte Element in einem ListView
ändert. Darüber hinaus kann die ViewCell.GetIsContextActionsLegacyModeEnabled
-Methode verwendet werden, um zurückzugeben, ob der Legacymodus für Kontextaktionen aktiviert ist.
Die folgenden Screenshots zeigen, dass ViewCell
der Legacymodus für Kontextaktionen aktiviert ist:
In diesem Modus sind die angezeigten Kontextmenüelemente für Zelle 1 und Zelle 2 identisch, obwohl verschiedene Kontextmenüelemente für Zelle 2 definiert sind.
Die folgenden Screenshots zeigen, dass ViewCell
der Legacymodus für Kontextaktionen deaktiviert ist, was das Standardverhalten Xamarin.Forms ist:
In diesem Modus werden die richtigen Kontextmenüelemente für Zelle 1 und Zelle 2 angezeigt.