【问题标题】:MvvmCross MvxSpinner does not update after re-enteringMvvmCross MvxSpinner 重新进入后不更新
【发布时间】:2017-04-29 15:30:14
【问题描述】:

已解决

拜托,我需要帮助!

安卓情况:

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- 哎呀! 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)

我会很高兴的!

谢谢。

【问题讨论】:

  • 当您说显示新视图时,这是一个新的片段或活动还是其他类型的视图?您是说当使用微调器返回页面时会记住先前选择的状态,并且您希望它是刷新重置页面?您的取消流程如何运作?

标签: xamarin mvvmcross


【解决方案1】:

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

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

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

但是,我相信此功能的行为是不受欢迎的。根据GitHub issue,它将您的 ViewModel 设置为 null。

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

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多