MvvmCross – MvxListView绑定多次点击
我正在使用MvvmCross开发一个应用程序,我在Android应用程序中遇到问题,设置绑定以捕获构成MvxListView项目的两个不同控件中的单击操作。 ViewModel中所有数据的绑定都可以正常工作这是我的FavouritesView的AXML
而MvxItemTemplate在这里:
这是我的FavouritesViewModel:
using System; using Cirrious.MvvmCross.Plugins.Messenger; using MyApp.Core.Managers; using MyApp.Core.Services; using System.Collections; using MyApp.Core.Domain; using System.Collections.Generic; using Cirrious.MvvmCross.ViewModels; using System.Collections.ObjectModel; using System.ServiceModel.Channels; using Cirrious.CrossCore; using MyApp.Core.Messages; using MyApp.Core.Helpers; namespace MyApp.Core.ViewModels { public class FavouritesViewModel: StandardsViewModel { private IFavouritesService _favouritesService; public FavouritesViewModel (ITextService textService, IMvxMessenger messenger, ISettingsManager settingsManager, IPageService pageService, IFavouritesService favouriteService): base(textService, messenger, settingsManager, pageService) { _logger.LeaveBreadcrumb ("FavouritesViewModel" , "Constructor"); _favouritesService = favouriteService; } public string TitleText { get { return _textService.GetString("Favourites"); } } private ObservableCollection _favourites; public ObservableCollection Favourites { get { return _favourites; } set { _favourites = value; RaisePropertyChanged (()=>Favourites); } } public async new void Init() { _logger.LeaveBreadcrumb ("FavouritesViewModel" , "Init"); var messenger = Mvx.Resolve (); messenger.Subscribe(message => { DeleteFavourite (message.ThisFavourite); }); var favs = await _favouritesService.GetAll (); _logger.LeaveBreadcrumb ("FavouritesViewModel:Init", "Favourites found:" + favs.Count.ToString ()); Favourites = new ObservableCollection (favs); } /// /// Deletes the favourite. /// /// Favourite. public void DeleteFavourite(Favourite favourite) { _logger.LeaveBreadcrumb ("FavouritesViewModel:DeleteFavourite", favourite.Title); Favourites.Remove (favourite); RaisePropertyChanged ("Favourites"); _favouritesService.Delete (favourite); } /// /// The delete favourite command. /// private MvxCommand _deleteFavouriteCommand; /// /// Gets the delete favourite command. /// /// The delete favourite command. public MvxCommand DeleteFavouriteCommand { get { _deleteFavouriteCommand = _deleteFavouriteCommand ?? new MvxCommand (DeleteFavourite); return _deleteFavouriteCommand; } } public void ShowFavourite(Favourite favourite) { if (favourite != null) { _logger.LeaveBreadcrumb (string.Format("FavouriteViewModel - Selected : {0}", favourite.Title)); // TODO need to display the favourite piece of info } } private MvxCommand _showFavouriteCommand; public MvxCommand ShowFavouriteCommand { get { _showFavouriteCommand = _showFavouriteCommand ?? new MvxCommand (ShowFavourite); return _showFavouriteCommand; } } public string ButtonRemoveText { get { return _textService.GetString ("RemoveFromFavourites"); } } public string AreYouSureText { get { return _textService.GetString ("AreYouSure"); } } public string RemoveFavouriteText { get { return _textService.GetString ("RemoveFavourite"); } } } }
我的问题的症状是View在单击“(x)删除”按钮时收到DeleteFavouriteMessage。 单击该项时,不会从MvxListView触发ItemClick事件ShowFavouriteCommand。
我确信我正在做某事,或者错过了一些简单的事情,但我正在努力取得任何进展。
我以前遇到过这个。 MvxItemTemplate
布局中的按钮正在窃取焦点。 尝试为布局中的按钮设置android:focusable="false"
。
将焦点从ListView行中的Button更改为列表项
我正在更新这个答案,以便更彻底。 为ListView
项中的常用Button控件设置android:focusable="false"
可以解决问题。 如果您使用的是ImageButton
则无法使用。
对于ImageButton
您需要在布局的根视图上设置android:descendantFocusability="blocksDescendants"
。
请参阅此处接受的答案: 无法单击带有imagebutton的listview行
我认为你缺少android:choiceMode="singleChoice"