如何绑定到“MvxLinearLayout”的“ItemClick”?

2023-12-27

我有一个ScrollView最初包裹着两个MvxListView控制。

Having ListView控制在一个ScrollView不过 Android 不支持,这是有道理的,因为它们都尝试填充父高度并提供自己的滚动逻辑。

我想要的是两个不可滚动的列表,其完整高度在我的ScrollView. ListView which MvxListView如果不手动修改高度,extends 不支持这一点。

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

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

有谁知道以可绑定方式执行此操作的干净方法?我不想附加onItemClick我的代码后面的处理程序。是否有另一个 MvvmCross 控件可以实现我想要的功能?


您可以扩展 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);
        }
    }
}

Adapter:

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就像你会做的ListView:

local:MvxBind="ItemClick SomeCommand" 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何绑定到“MvxLinearLayout”的“ItemClick”? 的相关文章

随机推荐