如何为 `MvxLinearLayout` 绑定到 `ItemClick`?

How do I bind to `ItemClick` for a `MvxLinearLayout`?

我有一个 ScrollView,它最初包含两个 MvxListView 控件。

虽然 Android 不支持 ScrollView 中的 ListView 控件,但这是有道理的,因为它们都试图填充 parent 高度并提供他们自己的滚动逻辑。

我想要的是两个不可滚动的列表,它们的完整高度在我的 ScrollView 中。 ListView which MvxListView extends 不支持这个,除非手动修改高度。

我想要这个的原因是因为我有两个单独的列表,我将它们绑定到不同的源并且它们都有自己的 header。我需要所有这些都可以在一个 ScrollView.

内滚动

然后我发现 MvxLinearLayout 是一个可绑定的 LinearLayout,它有一个 ItemSource 属性 我可以绑定到。它工作得很好,它显示我的项目并获得所有项目的完整高度,因此我可以在我的 ScrollView 中滚动我的两个列表。问题是它似乎没有 ItemClick 属性,所以我没有办法从我的列表中获取用户输入。

有谁知道以可绑定的方式执行此操作的简洁方法?我不想在后面的代码中附加 onItemClick 处理程序。是否有另一个 MvvmCross 控件可以做我想做的事情?

您需要为布局内的单独项目添加点击绑定。 您可以像这样向任何布局添加点击:

<RelativeLayout
    android:background="?android:attr/selectableItemBackground"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/relativeLayout1"
    local:MvxBind="Click SomeCommand">

您是否尝试过为 MvxLinearLayout 指定项目模板?例如,local:MvxItemTemplate="@layout/item_template"?您可以在要处理点击的控件上的项目模板内设置 MvvmCross Click 绑定。

您可以扩展 MvxLinearLayout 以支持 ItemClick:

public class MvxClickableLinearLayout : MvxLinearLayout
{
    public MvxClickableLinearLayout(Context context, IAttributeSet attrs)
        : this(context, attrs, new MvxClickableLinearLayoutAdapter(context))
    {
    }

    public MvxClickableLinearLayout(Context context, IAttributeSet attrs, MvxClickableLinearLayoutAdapter adapter)
        : base(context, attrs, adapter)
    {
        var mvxClickableLinearLayoutAdapter = Adapter as MvxClickableLinearLayoutAdapter;
        if (mvxClickableLinearLayoutAdapter != null)
        {
            mvxClickableLinearLayoutAdapter.OnItemClick = OnItemClick;
        }
    }

    public ICommand ItemClick { get; set; }

    public void OnItemClick(object item)
    {
        if (ItemClick != null && ItemClick.CanExecute(item))
        {
            ItemClick.Execute(item);
        }
    }
}

适配器:

public class MvxClickableLinearLayoutAdapter : MvxAdapterWithChangedEvent, View.IOnClickListener
{
    public delegate void ItemClickDelegate(object item);

    public ItemClickDelegate OnItemClick;

    public MvxClickableLinearLayoutAdapter(Context context)
        : base(context)
    {
    }

    public void OnClick(View view)
    {
        var mvxDataConsumer = view as IMvxDataConsumer;

        if (mvxDataConsumer != null && OnItemClick != null)
        {
            OnItemClick(mvxDataConsumer.DataContext);
        }
    }

    protected override View GetView(int position, View convertView, ViewGroup parent, int templateId)
    {
        View view = base.GetView(position, convertView, parent, templateId);
        view.SetOnClickListener(this);
        return view;
    }
}

现在您可以像绑定 ListView 一样绑定到 ItemClick:

local:MvxBind="ItemClick SomeCommand"