Android 上的 ViewCell 上下文操作

默认情况下,从 Xamarin.Forms 4.3 开始,当 Android 应用程序中的 ViewCellListView 中的每个项定义上下文操作时,若 ListView 中的选定项更改,则“上下文操作”菜单将更新。 但是,在以前版本的 Xamarin.Forms 中,上下文操作菜单未更新,此行为称为 ViewCell 旧模式。 如果 ListView 使用 DataTemplateSelector 从定义不同上下文操作的 DataTemplate 对象设置其 ItemTemplate,则此旧模式可能会导致行为不正确。

此特定于 Android 平台的方法启用 ViewCell 上下文操作菜单旧模式,用于实现后向兼容性,使得上下文操作菜单在 ListView 中的选定项更改时不更新。 在 XAML 中,可将 ViewCell.IsContextActionsLegacyModeEnabled 绑定属性设置为 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>

或者,可以使用 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 方法用于启用 ViewCell 上下文操作菜单旧模式,使得上下文操作菜单在 ListView 中选定项更改时不更新。 此外,ViewCell.GetIsContextActionsLegacyModeEnabled 方法还可用于返回是否启用上下文操作旧模式。

以下屏幕截图显示已启用 ViewCell 上下文操作旧模式:

Android 上已启用 ViewCell 旧模式的屏幕截图

在此模式下,显示的上下文操作菜单项对于单元格 1 和单元格 2 是相同的(尽管为单元格 2 定义了不同的上下文菜单项)。

以下屏幕截图显示已禁用 ViewCell 上下文操作旧模式,这是默认 Xamarin.Forms 行为:

Android 上已禁用 ViewCell 旧模式的屏幕截图

在此模式下,为单元格 1 和单元格 2 显示正确的上下文操作菜单项。