You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI中ViewCell.ContextActions菜单项显示错误页面问题求助

解决ListView长按操作项显示在错误页面的问题

问题场景

项目包含MainPage和InfoPage两个页面,InfoPage通过ListView展示Review数据。其余功能正常,但长按Review触发<ViewCell.ContextActions>中的操作项(尝试过ToolbarItem和MenuItem,问题一致)时,操作项会显示在MainPage而非当前的InfoPage上。

相关代码

<ContentPage.Resources>
    <ResourceDictionary>
        <toolkit:SelectedItemEventArgsConverter x:Key="SelectedItemEventArgsConverter"/>
    </ResourceDictionary>
</ContentPage.Resources>

<ContentPage.ToolbarItems>
    <ToolbarItem Text="Add" Command="{Binding AddCommand}"/>
    <ToolbarItem Text="Back" x:Name="ReturnToHomePageButton" Clicked="ReturnToHomePageButton_Clicked"/>
</ContentPage.ToolbarItems>

<VerticalStackLayout>
    <ListView
    BackgroundColor="Transparent"
    CachingStrategy="RecycleElement"
    HasUnevenRows="True"
    IsPullToRefreshEnabled="True"
    IsRefreshing="{Binding IsBusy, Mode=OneWay}"
    ItemsSource="{Binding Review}"
    RefreshCommand="{Binding RefreshCommand}"
    RefreshControlColor="Red"
    SelectionMode="None"
    SeparatorVisibility="None">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="model:Review">
                <ViewCell>
                    <ViewCell.ContextActions>
                        <ToolbarItem
                            Command="{Binding Source={x:Reference ReviewPage}, Path=BindingContext.RemoveCommand}"
                            CommandParameter="{Binding .}"
                            IsDestructive="True"
                            Text="Delete" />
                    </ViewCell.ContextActions>
                    <Grid Padding="10">
                        <Frame CornerRadius="20" HasShadow="True">
                            <StackLayout Orientation="Horizontal">
                                <StackLayout VerticalOptions="Center">
                                    <Label
                                        FontSize="Large"
                                        Text="{Binding Username}"
                                        VerticalOptions="Center"/>
                                    <controls:SimpleRatingControl 
                                        Amount="5"
                                        CurrentValue="{Binding Stars}"
                                        AccentColor="Yellow"
                                        StarSize="36" 
                                        VerticalOptions="End" />
                                    <Label
                                        FontSize="Small"
                                        Text="{Binding Text}"
                                        VerticalOptions="Center"/>
                                </StackLayout>
                            </StackLayout>
                        </Frame>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</VerticalStackLayout>

解决方案

1. 确认页面导航方式正确

导航到InfoPage时,必须使用导航栈推入的方式,而不是直接替换MainPage或嵌入为子视图:

// MainPage中跳转的代码示例
private async void NavigateToInfoPage(object sender, EventArgs e)
{
    await Navigation.PushAsync(new InfoPage());
}

如果使用Shell框架,确保通过路由跳转:

await Shell.Current.GoToAsync(nameof(InfoPage));

2. 优化ContextActions的绑定逻辑

原代码中使用x:Reference引用页面,容易出现上下文混淆。建议改用相对绑定直接关联ViewModel:

<ViewCell.ContextActions>
    <MenuItem
        Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodels:InfoPageViewModel}}, Path=RemoveCommand}"
        CommandParameter="{Binding .}"
        IsDestructive="True"
        Text="Delete" />
</ViewCell.ContextActions>

注:替换viewmodels:InfoPageViewModel为你实际的ViewModel命名空间和类型

如果坚持使用页面引用,需确保InfoPage的x:Name确实是ReviewPage,且没有命名冲突:

<!-- 在InfoPage的根标签添加正确的x:Name -->
<ContentPage x:Class="YourNamespace.InfoPage"
             x:Name="ReviewPage"
             ...>

3. 检查Shell配置(若使用)

如果项目基于Shell,确保InfoPage已正确注册路由,且未在Shell级别设置全局Toolbar导致冲突:

// AppShell.xaml.cs中注册路由
Routing.RegisterRoute(nameof(InfoPage), typeof(InfoPage));

4. 验证页面Toolbar的独立性

确保InfoPage的ContentPage.ToolbarItems未被全局样式或父容器覆盖,可临时移除MainPage的ToolbarItems测试,确认操作项的归属。

验证步骤

修改后重新运行项目,长按InfoPage中的Review项,查看操作项是否正确显示在当前页面的对应位置(iOS为滑动显示,Android为弹出菜单/顶部Toolbar)。

内容的提问来源于stack exchange,提问作者K_Ketchup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:53:34