绑定按钮单击ListView模板MvvMCross

我有一个listview,其中包含一个包含按钮的模板。 单击按钮时,我想要触发事件并返回listview行的值,因此我可以使用它将其添加到数据库中。 我的问题是,我不知道如何将我的buttonevent绑定到itemtemplate。 我尝试了一些方法但到目前为止没有成功。

我的清单视图:

   

我的ItemTemplate:

         

我的ViewModel:

 public class ListPresentationViewModel: MvxViewModel { private readonly ISQLService _sqlSvc; public ListPresentationViewModel (ISQLService sqlService) { _sqlSvc = sqlService; MenuCollection = _sqlSvc.MenuItemGetAll (); } private List _menuCollection = new List (); public List MenuCollection { get{ return _menuCollection;} set { _menuCollection = value; RaisePropertyChanged (() => MenuCollection); } } private IMvxCommand _orderBtnClick; public IMvxCommand OrderBtnClick{ get{ _orderBtnClick = _orderBtnClick ?? new MvxCommand(btnClick); return _orderBtnClick;} } private void btnClick() { //Do Something } } 

我在模板和列表视图上的按钮上放置了本地:MvxBind =“Click OrderBtnClick”。 当我从itemtemplate中删除按钮时,ItemClick似乎工作,但这不是我正在寻找的。 我希望按钮能够触发事件。 谁能指出我正确的方向?


更新

我已经尝试了斯图尔特小屋在这里发布的第二个建议。 这是我的包装类

 public class MenuItemWrap { MenuItem _mnuItem; ListPresentationViewModel _parent; public MenuItemWrap () { } public MenuItemWrap (MenuItem item, ListPresentationViewModel parent) { _mnuItem = item; _parent = parent; } public IMvxCommand Click { get { return new MvxRelayCommand (() => _parent.btnClick(WrapConverter.ConvertToWrapMenuItem(_mnuItem, _parent))); } } public MenuItem Item{ get { return _mnuItem; } } } 

我的ViewModel:

 public class ListPresentationViewModel: MvxViewModel { private readonly ISQLService _sqlSvc; public ListPresentationViewModel (ISQLService sqlService) { _sqlSvc = sqlService; MenuCollection = WrapConverter.ConvertToWrapperClass(_sqlSvc.MenuItemGetAll (), this); } private List _menuCollection = new List (); public List MenuCollection { get{ return _menuCollection;} set { _menuCollection = value; RaisePropertyChanged (() => MenuCollection); } } private IMvxCommand _orderBtnClick; public IMvxCommand OrderBtnClick{ get{ _orderBtnClick = _orderBtnClick ?? new MvxCommand (btnClick); return _orderBtnClick; } } public void btnClick(MenuItemWrap item) { MenuCollection.Clear (); } } 

这是我的模板

         

我的listview完美无缺。 所有属性都正确绑定,我可以看到名称,短描述和图像。 什么不起作用是按钮单击。 在我的应用程序输出中我得到一个错误说: MvxBind:警告:76.06无法绑定:未找到源属性源Cirrious.MvvmCross.Binding.Parse.PropertyPath.PropertyTokens.MvxPropertyNamePropertyToken在MenuItemWrap上

我尝试了一些方法来解决它,但没有成功。 我会提到我没有在MvvMCross程序集中找到RelayCommand类,所以我将代码从此处复制粘贴到我的项目中。

我找到了解决方案。 问题是点击绑定。 您应该只引用包装器类中的操作,而不是两者。 这是我的wrapperclass和listview itemtemplate。

ItemTemplate中:

     

WrapperClass:

 public class MenuItemWrap { MenuItem _mnuItem; ListPresentationViewModel _parent; public MenuItemWrap (MenuItem item, ListPresentationViewModel parent) { _mnuItem = item; _parent = parent; } public IMvxCommand OrderClick { get { return new MvxCommand (() => _parent.btnClick (_mnuItem)); } } public MenuItem Item{ get { return _mnuItem; } } } 

我的ViewModel:

 public class ListPresentationViewModel: MvxViewModel { private readonly ISQLService _sqlSvc; public ListPresentationViewModel (ISQLService sqlService) { _sqlSvc = sqlService; MenuCollection = WrapConverter.ConvertToWrapperClass (_sqlSvc.MenuItemGetAll(), this); } private int _catId; public int CategorieId { get{ return _catId;} set{ _catId = value; ChangeMenuCollection (); } } private void ChangeMenuCollection() { MenuCollection = WrapConverter.ConvertToWrapperClass (_sqlSvc.MenuItemByCategorie (_catId), this); } private List _menuCollection = new List (); public List MenuCollection { get{ return _menuCollection;} set { _menuCollection = value; RaisePropertyChanged (() => MenuCollection); } } private IMvxCommand _orderBtnClick; public IMvxCommand OrderBtnClick { get { _orderBtnClick = _orderBtnClick ?? new MvxCommand (btnClick); return _orderBtnClick; } } public void btnClick (MenuItem item) { //Do Something } } 
  1. vNext中的MvxCommand在v3中缩短为MvxCommand – 只是为了节省输入。
  2. 你的最后一个问题似乎是你绑定了Click btnClick.OrderBtnClick – 但是你的MenuItemWrap类没有btnClick属性 – 所以你真的要绑定Click Click