Skip to content Skip to sidebar Skip to footer

MvxRecyclerView Fluent API Binding

I am unable to bind ItemClick from MvxRecyclerView (or its Adapter) to a command on my ViewModel using Fluent API. It works if I put both ItemsSource and ItemClick in the XML so I

Solution 1:

When creating a custom MvxRecyclerViewHolder you need to make sure that you assign the Click command over to the ViewHolder. This is done in the OnCreateViewHolder override of your custom adapter.


Example for custom ViewHolder

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
        };
    }
}

Solution 2:

I can't reproduce your issue. I just created a new project, added a RecyclerView and added the following binding:

var set = this.CreateBindingSet<FirstView, FirstViewModel>();
set.Bind(recyclerView).For(v => v.ItemsSource).To(vm => vm.ViewModelItems);
set.Bind(recyclerView).For(v => v.ItemClick).To(vm => vm.ShowItemCommand);
set.Apply();

This works just as expected, where ItemClick triggers the ShowItemCommand. VM's look as follows:

public class ViewModelItem : MvxViewModel
{
    public void Init(string itemId)
    {
        Mvx.Trace($"Showing {itemId}");
    }

    public string Id { get; set; }
}


public class FirstViewModel
    : MvxViewModel
{
    public FirstViewModel()
    {
        ViewModelItems = new ViewModelItem[] {
            new ViewModelItem { Id = "Hello"},
            new ViewModelItem { Id = "World"},
            new ViewModelItem { Id = "Foo"},
            new ViewModelItem { Id = "Bar"},
            new ViewModelItem { Id = "Baz"}
        };
    }

    private IEnumerable<ViewModelItem> _viewModelItems;
    public IEnumerable<ViewModelItem> ViewModelItems
    {
        get { return _viewModelItems; }
        set { SetProperty(ref _viewModelItems, value); }
    }

    public MvxCommand<ViewModelItem> ShowItemCommand =>
        new MvxCommand<ViewModelItem>(DoShowItem);

    private void DoShowItem(ViewModelItem item)
    {
        ShowViewModel<ViewModelItem>(new { itemId = item.Id });
    }
}

Post a Comment for "MvxRecyclerView Fluent API Binding"