ViewPager 与 ViewModel 的绑定问题
ViewPager binding issues with ViewModel
我正在使用 ViewPager 在 MvvmCross 4.0.0-beta5 中实现选项卡。但是,ViewModel 的 EditText 绑定 属性 始终为 null。我也尝试更新到 MvvmCross 4.0.0-beta7,但没有成功。
这是我的 ViewPager
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/mspManagerToolbar"
layout="@layout/mspmanagertoolbar" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
local:tabGravity="fill"
local:tabMode="scrollable" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
local:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.AppBarLayout>
这是我的选项卡视图
<EditText
...
local:MvxBind="Text Title" />
上面的 EditText 绑定不起作用。标题总是空的。
<EditText
...
local:MvxBind="Text User.Title" />
以上 EditText 绑定工作完美。 User.Title 得到正确的值。
此处ViewPagerView.cs代码
public class CustomerDetailView : MvxCachingFragmentCompatActivity<CustomerDetailViewModel>
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.CustomerDetailView);
// Use toolbar as action bar
var toolbar = FindViewById<Toolbar>(Resource.Id.mspManagerToolbar);
if (toolbar != null)
{
// Toolbar will now take on default actionbar characteristics
SetSupportActionBar(toolbar);
}
// View Pager
var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
if (viewPager != null)
{
// Add tabs in view pager
var fragments = new List<MvxFragmentStatePagerAdapter.FragmentInfo>
{
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_DETAIL, typeof(Tab_CustomerDetail), typeof(CustomerDetailViewModel)),
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_CONTACT, typeof(Tab_CustomerContact), typeof(CustomerDetailViewModel)),
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_LOCATION, typeof(Tab_CustomerLocation), typeof(CustomerDetailViewModel)),
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_CONTRACT, typeof(Tab_CustomerContract), typeof(CustomerDetailViewModel))
};
viewPager.Adapter = new MvxFragmentStatePagerAdapter(this, SupportFragmentManager, fragments);
}
var tabLayout = FindViewById<TabLayout>(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
}
}
这是我的片段代码
[Register("app.droid.views.fragments.Tab_CustomerDetail")]
public class Tab_CustomerDetail : MvxFragment
{
#region Public Method
/// <summary>
/// tab customer detail view
/// </summary>
/// <param name="inflater"></param>
/// <param name="container"></param>
/// <param name="savedInstanceState"></param>
/// <returns></returns>
public override View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
var view = this.BindingInflate(Resource.Layout.frg_tab_CustomerDetail, null);
return view;
}
#endregion
}
这是 ViewModel 属性
public string Title
{
get
{
return (title);
}
set
{
if (value != title)
{
title = value;
RaisePropertyChanged(() => this.Title);
}
}
}
public User User
{
get
{
return (repositoryService.User);
}
set
{
repositoryService.User = value;
RaisePropertyChanged(() => User);
}
}
标题 属性 变为空并且 User.Title 工作完美。所以请让我知道哪里出错了?
更改 属性 是否可以解决问题?
public string Title
{
get
{
return title;
}
set
{
title = value;
RaisePropertyChanged(() => this.Title);
}
}
问题是我从 activity 保存了我的数据,所以我没有获得视图的价值。因为它为每个片段创建新的视图模型实例,因为没有获得更新的视图值。现在我从片段中保存我的数据,现在我在视图模型中获取视图的所有值。
我正在使用 ViewPager 在 MvvmCross 4.0.0-beta5 中实现选项卡。但是,ViewModel 的 EditText 绑定 属性 始终为 null。我也尝试更新到 MvvmCross 4.0.0-beta7,但没有成功。
这是我的 ViewPager
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/mspManagerToolbar"
layout="@layout/mspmanagertoolbar" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
local:tabGravity="fill"
local:tabMode="scrollable" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
local:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.AppBarLayout>
这是我的选项卡视图
<EditText
...
local:MvxBind="Text Title" />
上面的 EditText 绑定不起作用。标题总是空的。
<EditText
...
local:MvxBind="Text User.Title" />
以上 EditText 绑定工作完美。 User.Title 得到正确的值。
此处ViewPagerView.cs代码
public class CustomerDetailView : MvxCachingFragmentCompatActivity<CustomerDetailViewModel>
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.CustomerDetailView);
// Use toolbar as action bar
var toolbar = FindViewById<Toolbar>(Resource.Id.mspManagerToolbar);
if (toolbar != null)
{
// Toolbar will now take on default actionbar characteristics
SetSupportActionBar(toolbar);
}
// View Pager
var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
if (viewPager != null)
{
// Add tabs in view pager
var fragments = new List<MvxFragmentStatePagerAdapter.FragmentInfo>
{
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_DETAIL, typeof(Tab_CustomerDetail), typeof(CustomerDetailViewModel)),
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_CONTACT, typeof(Tab_CustomerContact), typeof(CustomerDetailViewModel)),
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_LOCATION, typeof(Tab_CustomerLocation), typeof(CustomerDetailViewModel)),
new MvxFragmentStatePagerAdapter.FragmentInfo(TAB_CONTRACT, typeof(Tab_CustomerContract), typeof(CustomerDetailViewModel))
};
viewPager.Adapter = new MvxFragmentStatePagerAdapter(this, SupportFragmentManager, fragments);
}
var tabLayout = FindViewById<TabLayout>(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
}
}
这是我的片段代码
[Register("app.droid.views.fragments.Tab_CustomerDetail")]
public class Tab_CustomerDetail : MvxFragment
{
#region Public Method
/// <summary>
/// tab customer detail view
/// </summary>
/// <param name="inflater"></param>
/// <param name="container"></param>
/// <param name="savedInstanceState"></param>
/// <returns></returns>
public override View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
var view = this.BindingInflate(Resource.Layout.frg_tab_CustomerDetail, null);
return view;
}
#endregion
}
这是 ViewModel 属性
public string Title
{
get
{
return (title);
}
set
{
if (value != title)
{
title = value;
RaisePropertyChanged(() => this.Title);
}
}
}
public User User
{
get
{
return (repositoryService.User);
}
set
{
repositoryService.User = value;
RaisePropertyChanged(() => User);
}
}
标题 属性 变为空并且 User.Title 工作完美。所以请让我知道哪里出错了?
更改 属性 是否可以解决问题?
public string Title
{
get
{
return title;
}
set
{
title = value;
RaisePropertyChanged(() => this.Title);
}
}
问题是我从 activity 保存了我的数据,所以我没有获得视图的价值。因为它为每个片段创建新的视图模型实例,因为没有获得更新的视图值。现在我从片段中保存我的数据,现在我在视图模型中获取视图的所有值。