如何在MvvmCross Android的ViewModel中捕获MvxListView双击事件
MvxListView双击事件捕获解决方案(MVVM架构)
针对你的MvxListView需求,下面提供两种可行的解决方案:
方案一:自定义MvxListView扩展双击绑定
这种方式更贴合MVVM的绑定思想,将双击事件封装为可绑定属性:
- 创建自定义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; } }
- 注册自定义绑定属性
在Setup类的InitializeBindingBuilder方法中添加绑定配置:
protected override void InitializeBindingBuilder() { base.InitializeBindingBuilder(); BindingBuilder.BindingNames.Add(new Dictionary<string, string> { {"ItemDoubleClick", nameof(MvxDoubleClickListView.ItemDoubleClickCommand)} }); }
- 修改布局文件使用自定义控件
<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"/>
- 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
相关产品推荐
相关产品推荐

