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

如何在MvvmCross Android的ViewModel中捕获MvxListView双击事件

MvxListView双击事件捕获解决方案(MVVM架构)

针对你的MvxListView需求,下面提供两种可行的解决方案:


方案一:自定义MvxListView扩展双击绑定

这种方式更贴合MVVM的绑定思想,将双击事件封装为可绑定属性:

  1. 创建自定义MvxListView子类
public class MvxDoubleClickListView : MvxListView
{
    private long _lastClickTime;
    private const int DoubleClickThreshold = 300; // 双击间隔阈值(毫秒)

    public MvxDoubleClickListView(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        ItemClick += OnItemClicked;
    }

    public ICommand ItemDoubleClickCommand { get; set; }

    private void OnItemClicked(object sender, AdapterView.ItemClickEventArgs e)
    {
        var currentTime = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond;
        if (currentTime - _lastClickTime <= DoubleClickThreshold)
        {
            var item = Adapter.GetItem(e.Position);
            ItemDoubleClickCommand?.Execute(item);
        }
        _lastClickTime = currentTime;
    }
}
  1. 注册自定义绑定属性
    在Setup类的InitializeBindingBuilder方法中添加绑定配置:
protected override void InitializeBindingBuilder()
{
    base.InitializeBindingBuilder();
    BindingBuilder.BindingNames.Add(new Dictionary<string, string>
    {
        {"ItemDoubleClick", nameof(MvxDoubleClickListView.ItemDoubleClickCommand)}
    });
}
  1. 修改布局文件使用自定义控件
<yournamespace.MvxDoubleClickListView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:choiceMode="multipleChoice"
    android:layout_alignParentTop="true"
    local:MvxBind="ItemsSource ProductObsList;ItemClick ProductSelectedCommand;SelectedItem MyChosenItem;ItemDoubleClick ProductDoubleClickedCommand;"
    local:MvxItemTemplate="@layout/_product"/>
  1. ViewModel中实现双击命令
public ICommand ProductDoubleClickedCommand => new MvxCommand<ProductModel>(OnProductDoubleClicked);

private void OnProductDoubleClicked(ProductModel product)
{
    // 这里编写双击事件的处理逻辑
}

方案二:利用现有ItemClick命令快速实现(无需自定义控件)

如果不想自定义控件,可以在ViewModel中通过记录点击时间差判断双击:

private long _lastProductClickTime;
private const int DoubleClickThreshold = 300;

public ICommand ProductSelectedCommand => new MvxCommand<ProductModel>(OnProductSelected);

private void OnProductSelected(ProductModel product)
{
    var currentTime = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond;
    if (currentTime - _lastProductClickTime <= DoubleClickThreshold)
    {
        HandleProductDoubleClick(product);
        _lastProductClickTime = 0; // 重置时间,避免连续触发
        return;
    }
    _lastProductClickTime = currentTime;
    // 原有单击逻辑
    HandleProductSingleClick(product);
}

private void HandleProductDoubleClick(ProductModel product)
{
    // 双击处理代码
}

private void HandleProductSingleClick(ProductModel product)
{
    // 单击处理代码
}

这种方式无需修改布局和自定义控件,适合快速实现,但逻辑会耦合在命令处理方法中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:32:50