C# 如何为“MvxLinearLayout”绑定到“ItemClick”?

C# 如何为“MvxLinearLayout”绑定到“ItemClick”?,c#,android,xamarin,mvvmcross,mvxbind,C#,Android,Xamarin,Mvvmcross,Mvxbind,我有一个ScrollView,它最初包装了两个MvxListView控件 Android不支持在ScrollView中使用ListView控件,这是有道理的,因为它们都试图填充父级高度并提供自己的滚动逻辑 我想要的是两个可展开的列表,它们的全部高度在我的滚动视图中ListView扩展的MvxListView不支持此操作 我之所以要这样做,是因为我有两个单独的列表,我已经绑定到单独的源,它们都有自己的标题。我需要在一个滚动视图中滚动所有这些内容 然后我找到了MvxLinearLayout,它是一个

我有一个
ScrollView
,它最初包装了两个
MvxListView
控件

Android不支持在
ScrollView
中使用
ListView
控件,这是有道理的,因为它们都试图填充父级高度并提供自己的滚动逻辑

我想要的是两个可展开的列表,它们的全部高度在我的
滚动视图中<如果不手动修改高度,code>ListView
扩展的
MvxListView
不支持此操作

我之所以要这样做,是因为我有两个单独的列表,我已经绑定到单独的源,它们都有自己的标题。我需要在一个
滚动视图中滚动所有这些内容

然后我找到了
MvxLinearLayout
,它是一个可绑定的
LinearLayout
,它有一个
ItemSource
属性可以绑定。它工作得非常出色,它显示我的项目并获得所有项目的完整高度,这样我就可以在我的
滚动视图中滚动两个列表。问题是它似乎没有
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指定项目模板?e、 例如,
local:MvxItemTemplate=“@layout/item_-template”
?您可以在要处理单击的控件的项目模板内设置MvvmCross-Click绑定。

您可以扩展MvxLinearLayout以支持
项目单击:

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;
    }
}
现在,您可以绑定到
ItemClick
,就像使用
列表视图一样:

local:MvxBind="ItemClick SomeCommand" 

嗨,谢谢你的回复。是的,我知道我可以做到,但是
MvxLinearLayout
的关键在于它有一个
ItemsSource
,它是数据绑定的,所以它会自动将我的项目添加到列表中。要执行您的建议,我必须手动创建我的项目的所有视图并绑定到
单击
,或者在它们通过
MvxLinearLayout自动绑定数据后循环浏览它们,从MVVM的角度来看,这不是很清晰。我不明白为什么不能将所有数据填充到单个ListView?在MvvmCross 5.1中不起作用,因为mvxDataConsumer在解析时为空(作为IMvxDataConsumer查看)。知道原因吗?使用
view?.Tag作为IMvxDataConsumer