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

如何在.NET MAUI中为ListView实现长按功能?

.NET MAUI ListView 长按实现方案(无需付费库/平台特定代码)

你完全可以用.NET MAUI内置的LongPressGestureRecognizer来实现ListView每行的长按功能,不需要付费库、平台特定代码或者旧的Xamarin Forms库,具体实现步骤如下:

方法一:MVVM命令绑定(推荐)

在ListView的ItemTemplate中,给每行的根布局添加长按手势识别器,并绑定到ViewModel的命令,同时传递当前行的数据:

<!-- 给ListView命名以便绑定上下文 -->
<ListView x:Name="MyListView" ItemsSource="{Binding Items}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid Padding="10">
                    <!-- 行内容示例 -->
                    <Label Text="{Binding ItemName}" FontSize="16" />
                    
                    <!-- 添加长按手势识别器 -->
                    <Grid.GestureRecognizers>
                        <LongPressGestureRecognizer 
                            Command="{Binding BindingContext.LongPressItemCommand, Source={x:Reference MyListView}}"
                            CommandParameter="{Binding .}" />
                    </Grid.GestureRecognizers>
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

在ViewModel中实现对应的命令,处理长按后的DisplayActionSheet逻辑:

public class YourViewModel : INotifyPropertyChanged
{
    public ObservableCollection<YourItemModel> Items { get; set; }
    public ICommand LongPressItemCommand { get; }

    public YourViewModel()
    {
        Items = new ObservableCollection<YourItemModel>();
        // 初始化命令
        LongPressItemCommand = new Command<YourItemModel>(async (selectedItem) =>
        {
            if (selectedItem == null) return;
            
            var actionResult = await Application.Current.MainPage.DisplayActionSheet(
                "选择操作", 
                "取消", 
                null, 
                "编辑", 
                "删除");

            switch (actionResult)
            {
                case "编辑":
                    // 执行编辑逻辑,比如跳转到编辑页或修改数据
                    break;
                case "删除":
                    Items.Remove(selectedItem);
                    break;
            }
        });
    }

    // 实现INotifyPropertyChanged接口(此处省略代码,按需添加)
    public event PropertyChangedEventHandler PropertyChanged;
}

方法二:后台事件处理

如果不使用MVVM模式,也可以直接绑定事件到页面后台代码:

<ListView ItemsSource="{Binding Items}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid Padding="10">
                    <Label Text="{Binding ItemName}" />
                    <Grid.GestureRecognizers>
                        <LongPressGestureRecognizer LongPressed="OnListViewItemLongPressed" />
                    </Grid.GestureRecognizers>
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

页面后台代码:

private async void OnListViewItemLongPressed(object sender, EventArgs e)
{
    // 获取当前长按的项
    var senderGrid = sender as Grid;
    var selectedItem = senderGrid?.BindingContext as YourItemModel;
    
    if (selectedItem == null) return;

    var actionResult = await DisplayActionSheet(
        "选择操作", 
        "取消", 
        null, 
        "编辑", 
        "删除");

    // 根据选择结果处理逻辑
    switch (actionResult)
    {
        case "编辑":
            // 编辑逻辑
            break;
        case "删除":
            // 删除逻辑,比如从数据源移除
            (BindingContext as YourViewModel).Items.Remove(selectedItem);
            break;
    }
}

关键说明:

  • 把手势识别器加到每行的根布局(比如Grid)上,就能确保整行都能触发长按
  • 不需要额外依赖,LongPressGestureRecognizer是.NET MAUI的内置控件,全平台通用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:06:06