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