【问题标题】:How to go back more than one view model in mvvm light如何在 mvvm light 中返回多个视图模型
【发布时间】:2023-04-03 22:57:01
【问题描述】:

我在做 xamarin 开发,我不做表单。

我想返回 3 个视图控制器/活动,但返回方法是返回一个视图控制器或活动

如果我使用 navigateto,我相信会再添加一次视图控制器/活动。即两个实例。

那么如何解决这个问题呢?

更新: 这是导航界面,也无法访问导航堆栈

【问题讨论】:

    标签: xamarin xamarin.ios xamarin.android viewmodel mvvm-light


    【解决方案1】:

    如果您要返回,请使用INavigationService.GoBack();。您可以连续调用 3 次以返回 3 页。

    private void GoBackThree()
    {
        _navigationService.GoBack();
        _navigationService.GoBack();
        _navigationService.GoBack();
    }
    

    【讨论】:

    • 但是过渡看起来不会很糟糕
    • 是否可以剪切过渡并使其看起来像另一个被推到顶部
    • 如果我们能在没有过渡的情况下返回 3 次就好了
    • 是的,动画看起来会跳回来。您可以实现 INavigationService 并将 GoBack 实现设置为在没有动画的情况下触发。 Navigation.PopAsync 需要一个 bool 参数来进行动画处理。就 mvvm light 及其导航服务而言,这差不多。如果您想要强大的选项,您应该推出自己的导航服务,该服务可以为动画提供一些选项。
    • 谢谢,有没有关于如何做到这一点的指南或示例?如果有任何流行的第三方可用的东西,定制让我知道
    【解决方案2】:

    我之前没有使用过 MVVM Light,但我对 Xamarin Forms 有相当多的经验。我曾经使用 MVVM Cross 进行导航,但最终发现内置的 Xamarin Forms Navigation 要好得多,我遇到了与您在这里所拥有的类似的场景。

    在引擎盖下看起来 MVVM Light 只是封装了 Xamarin 表单导航 - http://mvvmlight.codeplex.com/SourceControl/latest#Samples/Flowers/Flowers.Forms/Flowers.Forms/Helpers/NavigationService.cs

    我认为您不需要放弃 MVVM Light 导航,但您确实需要深入了解以实现导航而不看到三个转换。我没有用 MVVM Light 试过这个,但它在普通的表单导航中效果很好。

    第 1 步

    访问底层 Xamarin Forms 导航:

    var navigation = Application.Current.MainPage.Navigation;
    

    第 2 步

    删除导航返回时要跳过的两个页面。在向后导航之前删除它们很重要,否则您将获得双重转换(注意 -2 是因为您要删除倒数第二页)。

    var firstPageToRemove = navigation.NavigationStack[navigation.NavigationStack.Count - 2];
    navigation.RemovePage(firstPageToRemove);
    
    var secondPageToRemove = navigation.NavigationStack[navigation.NavigationStack.Count - 2];
    navigation.RemovePage(secondPageToRemove);
    

    第 3 步

    向后导航

    _navigationService.GoBack();
    

    我希望这对你有用。

    另类考虑

    我的应用程序中有一个类似的应用程序,我已经更优雅地解决了它。如果您知道您永远不需要能够导航回之前的页面。当您推送新页面时,如果您不再需要之前的页面,您实际上可以删除它。请注意,您必须在 推送新页面后删除页面,否则您将获得两次转换。我在标准表单导航之上使用了这个扩展方法,我在第 1 步中向您展示了如何访问它来实现它。

    public static async Task ReplaceCurrentAsync(this INavigation navigation, Page page, bool animated = false)
    {
        var curentPage = navigation.NavigationStack.Last();
    
        await navigation.PushAsync(page, animated);
    
        navigation.RemovePage(curentPage);
    }
    

    【讨论】:

    • MVVM light 中无法访问导航堆栈
    • 我知道无法从 MVVM 灯访问导航堆栈。这就是为什么我在步骤 1 中为您提供了将访问底层导航堆栈的代码。你试过这三个步骤了吗?
    • 是的,亲爱的...在视图模型中...我收到错误“名称应用程序在当前上下文中不存在”...在视图控制器/活动中我收到错误“应用程序不存在包含当前“的定义”
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多