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

Hei*_*tad 5 c# android mvvmcross xamarin mvxbind

我有一个ScrollView最初包含两个MvxListView控件.

ListView控制在一个ScrollView不被安卓虽然,这是有道理的支持,因为他们都试图填补母公司的高度,并提供自己的滚动逻辑.

我想要的是两个不可滚动的列表,它们的全部高度在我的内部ScrollView.如果不手动破解高度ListView,MvxListView扩展不支持此功能.

我想要这个的原因是因为我有两个单独的列表,我必须分开源,它们都有自己的标题.我需要所有这些都可以在一个内滚动ScrollView.

然后我发现MvxLinearLayout哪个是可绑定的LinearLayout,它具有ItemSource我可以绑定的属性.它工作得很好,它显示我的项目并获得所有项目的全部高度,所以我可以滚动我的列表ScrollView.问题是它似乎没有ItemClick属性,所以我无法从列表中获取用户输入.

有没有人知道以可绑定的方式做到这一点的干净方式?我不想onItemClick在后面的代码中附加处理程序.还有另一个MvvmCross控件可以做我想要的吗?

Ond*_*unc 10

您可以扩展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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

适配器:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以绑定到ItemClick就像你使用ListView:

local:MvxBind="ItemClick SomeCommand" 
Run Code Online (Sandbox Code Playgroud)

  • 不在MvvmCross 5.1中工作,因为mvxDataConsumer在解析时为null(视图为IMvxDataConsumer).知道为什么吗? (3认同)