重新进入后,MvvmCross MvxSpinner不会更新

时间:2017-04-27 10:26:39

标签: xamarin mvvmcross

解决

拜托,我需要一些帮助!

Android情况:

MSVisualStudio 2015 + Xamarin + Mvvmcross 4.4

一个活动和几个片段。使用默认演示者。

1-使用MvxRecyclerView查看(片段),选择一行进行编辑。

2-使用MvxSpinner显示新视图(片段),并将其值(A)更改为另一个(B)。记住:A& B是对象。

<Mvx.MvxSpinner
    android:id="@+id/spinner_academic_start_week"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    local:MvxDropDownItemTemplate="@layout/spinner_basic"
    local:MvxItemTemplate="@layout/item_spinner_basic"
    local:MvxBind="ItemsSource AcademicYearWeeksCollection; SelectedItem AcademicStartWeek; HandleItemSelected SelectAcademicStartWeekCommand" />

并且有一个带

的ViewModel
public IList<AcademicYearWeeks> AcademicYearWeeksCollection { get { return _academicYearWeeksCollection; } }

其中 AcademicYearWeeks 是一个具有属性等的类。

3-取消版本并返回使用MvxRecyclerView查看。

4-重复单击以编辑同一行。

5- Oooppps! Spinner显示B不是A.为什么????

其他考虑因素:

使用

调用带有微调器的片段
ShowViewModel<CourseViewModel>(
    new
     {
        courseId = item.CourseId
     });

与其ViewModel相关联

public void Init(int courseId)
{
    _courseId = courseId;
}

public override void Start()
{
    base.Start();

    LoadAcademicYearWeeksCollection();

    if (_courseId == 0)
        NewCourse();
    else
        LoadCourse();
}

并使用

关闭
Close(this)

我会非常感激!

感谢。

1 个答案:

答案 0 :(得分:0)

使用MvxFragment属性创建片段时,默认情况下IsCacheableFragment设置为true。因此,当片段和ViewModel被缓存时,您将获得第二次返回页面时遇到的行为。

理想情况下,您应该只能将IsCacheableFragment设置为false

[MvxFragment(typeof(MainViewModel), Resource.Id.content_frame,
    IsCacheableFragment = false)]

但是,我相信这个功能的行为是不受欢迎的。根据{{​​3}},它将您的ViewModel设置为null。

您可以尝试另一种方法来强制片段和ViewModel对刷新自己。在您的片段中,父级活动会覆盖ShowFragment并将forceAddToBackStack设置为带有微调器的ViewModel的真实

protected override void ShowFragment(string tag, int contentId, Bundle bundle, bool forceAddToBackStack = false, bool forceReplaceFragment = false)
{
    if (tag.Equals(typeof(<<Your View Model Type>>).FullName))
        forceReplaceFragment = true;

    base.ShowFragment(tag, contentId, bundle, forceAddToBackStack, forceReplaceFragment);
}