Ser*_*que 10 android xamarin.android mvvmcross
让我说我有一个简单的布局与MvxListView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/LiivControl.Client.Droid"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Mvx.MvxListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
local:MvxBind="ItemsSource AutoListItems; ItemClick AutoListItemClicked"
local:MvxItemTemplate="@layout/vbmvxautoviewlistitem" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我的项目模板布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/LiivControl.Client.Droid"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:paddingLeft="15dip">
<TextView
android:id="@+id/list_complex_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/list_complex_caption"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我想从代码隐藏中为itemtemplate中的两个textview元素指定绑定.我不确定如何最好地去做.我猜我可以在MvxListView后面的视图代码中做一些"OnViewModelSet".我尝试过以下但是因为它无法找到控件而显然无效.
protected override void OnViewModelSet()
{
IVbMvxAutoListViewModel vm = base.ViewModel as IVbMvxAutoListViewModel;
TextView title = this.FindViewById<TextView>(Resource.Id.list_complex_title);
this.CreateBinding(title).For(x => x.Text).To(vm.ListItemDescriptor.TitlePropName).Apply();
TextView subTitle = this.FindViewById<TextView>(Resource.Id.list_complex_caption);
this.CreateBinding(subTitle).For(x => x.Text).To(vm.ListItemDescriptor.SubTitlePropName).Apply();
base.OnViewModelSet();
}
Run Code Online (Sandbox Code Playgroud)
我的另一个想法是以某种方式拦截itemtemplate视图的oncreate,但如果我为itemtemplate布局创建一个视图代码文件,则不会调用OnCreate.
Stu*_*art 16
要在代码中进行绑定,最好是:
MvxListViewItem MvxAdapter以返回自定义列表视图项MvxListView以使用自定义MvxAdapter没有经过测试,但代码大致如下:
MvxListViewItempublic class CustomListItemView
: MvxListItemView
{
public MvxListItemView(Context context,
IMvxLayoutInflater layoutInflater,
object dataContext,
int templateId)
: base(context, layoutInflater, dataContext, templateId)
{
var control = this.FindViewById<TextView>(Resource.Id.list_complex_title);
var set = this.CreateBindingSet<CustomListViewItem, YourThing>();
set.Bind(control).To(vm => vm.Title);
set.Apply();
}
}
Run Code Online (Sandbox Code Playgroud)
MvxAdapter在这个覆盖 CreateBindableView
public class CustomAdapter
: MvxAdapter
{
public CustomAdapter(Context context)
: base(context)
{
}
protected override IMvxListItemView CreateBindableView(object dataContext, int templateId)
{
return new CustomListItemView(_context, _bindingContext.LayoutInflater, dataContext, templateId);
}
}
Run Code Online (Sandbox Code Playgroud)
原文:https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxAdapter.cs#L298
MvxListView以使用适配器这应该很简单:
public class CustomListView
: MvxListView
{
public CustomListView(Context context, IAttributeSet attrs)
: base(context, attrs, new CustomAdapter(context))
{
}
}
Run Code Online (Sandbox Code Playgroud)
只要这是在您的主UI组件中,这应该在您的axml中可用:
<CustomListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
local:MvxBind="ItemsSource AutoListItems; ItemClick AutoListItemClicked"
local:MvxItemTemplate="@layout/vbmvxautoviewlistitem" />
Run Code Online (Sandbox Code Playgroud)
如果CustomListView不是在你的主UI组件,然后有一些技巧,以获得MvvmCross期间把它捡起来的Setup-看到提供了定制的Android视图组件在https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App -和-安装#维基提供定制的视图,机器人
以上是最好的方法(IMO) - 但如果你想,那么只需在自定义适配器中应用绑定并OnCreate在你的设置中设置适配器就可以用更少的代码完成它Activity
| 归档时间: |
|
| 查看次数: |
7771 次 |
| 最近记录: |