我无法使用fluent api将来自mvxrecyclerview(或其适配器)的itemclick绑定到viewmodel上的命令。如果我把itemssource和itemclick都放在xml中,这样我就不会对这样的解决方案感兴趣,那么它就会工作。
我用这篇文章作为一个很好的指导(How to use the MvvmCross fluent API to bind a RecyclerView item's TextView to a property of its ViewModel on Android?),除了我无法将itemclick on mvxrecyclerview(或适配器)绑定到mainviewmodel的命令,该命令将带我到下一个片段(itemssource的工作方式像一个符咒,但它是一个属性,而不是一个命令!)是的。
为了简洁起见,我不会从原始post(How to use the MvvmCross fluent API to bind a RecyclerView item's TextView to a property of its ViewModel on Android?)复制代码,因此假设来自该post的mainviewmodel已通过showitemcommand命令进行了增强:
public class MainViewModel : MvxViewModel
{
private IEnumerable<ViewModelItem> _viewModelItems;
public IEnumerable<ViewModelItem> ViewModelItems
{
get { return _viewModelItems; }
set { SetProperty(ref _viewModelItems, value); }
}
public MvxCommand<ViewModelItem> ShowItemCommand
{
get
{
return new MvxCommand<ViewModelItem>(selectedItem =>
{
ShowViewModel<ViewModelItem>
(new { itemId = selectedItem.Id });
});
}
}
}
其他的都已经按照参考的帖子实现了。
现在,除了itemssource之外,我还想将itemsclick连接到mvxrecyclerview(或适配器)上的命令。这些命令可以互换的原因是mvxrecyclerview只是将这些命令转发给适配器。
显然,这应该有效…但它不能:
adapter.ItemClick = ViewModel.ShowItemCommand;
这也不起作用:
set.Bind(recyclerView).For(v => v.ItemClick).To(vm => vm.ShowItemCommand);
最佳答案
创建自定义MvxRecyclerViewHolder
时,需要确保将click命令分配给ViewHolder
。这是在自定义适配器的覆盖中完成的。
自定义示例OnCreateViewHolder
public class MyAdapter : MvxRecyclerAdapter
{
public MyAdapter(IMvxAndroidBindingContext bindingContext)
: base(bindingContext)
{
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var itemBindingContext = new MvxAndroidBindingContext(parent.Context, this.BindingContext.LayoutInflaterHolder);
var view = this.InflateViewForHolder(parent, viewType, itemBindingContext);
return new MyViewHolder(view, itemBindingContext)
{
Click = ItemClick,
LongClick = ItemLongClick
};
}
}