ViewCell-Kontextaktionen unter Android

Beispiel herunterladen Das Beispiel herunterladen

Wenn ein ViewCell in einer Android-Anwendung Kontextaktionen für jedes Element in einem ListViewdefiniert, 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 truefestgelegt 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:

Screenshot: Aktivierter ViewCell-Legacymodus im Android

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:

Screenshot: ViewCell-Legacymodus deaktiviert, in Android

In diesem Modus werden die richtigen Kontextmenüelemente für Zelle 1 und Zelle 2 angezeigt.