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

时间:2015-07-20 08:31:19

标签: c# android xamarin mvvmcross mvxbind

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

虽然Android不支持ListView中的ScrollView控件,但这有意义,因为它们都会尝试填充父级高度并提供自己的滚动逻辑。

我想要的是两个不可滚动的列表,其全部高度位于ScrollView内。 ListView扩展的MvxListView并不支持此操作而不会手动攻击高度。

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

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

有没有人知道以可绑定方式执行此操作的简洁方法?我不想在我的代码中附加onItemClick个处理程序。还有另一个可以做我想做的MvvmCross控件吗?

3 个答案:

答案 0 :(得分: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);
        }
    }
}

适配器:

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" 

答案 1 :(得分:0)

您需要将Click绑定添加到布局内的单独项目。 您可以将Click添加到任何布局,如下所示:

function ajax(url,data,success) {
    var request = new XMLHttpRequest();
    request.open("POST", url);
    request.onreadystatechange = function(object) {
        if(request.readyState === 3) {
            success(request);
        }
    };
    request.setRequestHeader("Content-Type","application/json")
    request.send(data);
}

答案 2 :(得分:0)

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