【问题标题】:Navigate to ViewModel From Current View Instead of RootView从当前视图而不是 RootView 导航到 ViewModel
【发布时间】:2018-09-10 21:37:16
【问题描述】:

有没有办法从我的当前视图而不是根视图导航到 ViewModel?

我创建了一个从根视图模态呈现的视图模型,并希望在该视图中呈现一个视图模型。

例如,当从我的模态视图调用_navigationService.Navigate<MyViewModel>(); 时,根视图导航到 MyViewModel 而不是当前的模态视图。这会使我的模态屏幕留下一个空白页面,直到您将其关闭并看到导航已发生在下方。

我要创建自定义导航,还是有更好的方法?

编辑

这里有一些代码:

我的视图模型

 public class ViewModel1 : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;

    public ViewModel1(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public IMvxCommand NavigateCommand => new MvxCommand(ChangeView);
    void ChangeView()
    {
        _navigationService.Navigate<ViewModel2>();
    }
}

我的观点

 [MvxModalPresentation(WrapInNavigationController = true, ModalPresentationStyle = UIModalPresentationStyle.Custom, Animated = false)]
public partial class MyView : MvxViewController
{
    ViewModel1 VM;

    public MyView() : base("MyView", null)
    {
    }

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

        NavigationController.NavigationBar.Hidden = true;

        var set = this.CreateBindingSet<MyView, ViewModel1 >();
        set.Bind(NextButton).To(vm => vm.NavigateCommand);
        set.Apply();
    }

    public override void DidReceiveMemoryWarning()
    {
        base.DidReceiveMemoryWarning();
        // Release any cached data, images, etc that aren't in use.
    }
}

我想让导航命令在呈现的模式中呈现 ViewModel2。

【问题讨论】:

  • 你能展示你的代码吗?
  • 添加了一些代码:)

标签: ios xamarin mvvmcross


【解决方案1】:

对于这种自定义,您可能需要编写一个自定义演示者,然后您可以在那里摆弄以实现您可以使用本机实现的任何目标。

我正在给出一些提示。

在 AppDelegate 里面完成启动。

 public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {   

    Window = new UIWindow(UIScreen.MainScreen.Bounds);
            var presenter = new DelegatingPresenter(this, Window);
            var setup = new Setup(this, presenter);
            setup.Initialize();

            var startup = Mvx.Resolve<IMvxAppStart>();
            startup.Start();
            ---
            ---
}

DelegatingPresenter 看起来像:

public class DelegatingPresenter : MvxIosViewPresenter {


        private UIWindow currentWindow;

        public DelegatingPresenter(AppDelegate appDelegate, UIWindow window)
            : base(appDelegate, window) {


            currentWindow = window;
            --
            ---

        }
        protected override void SetWindowRootViewController(UIViewController controller, MvvmCross.iOS.Views.Presenters.Attributes.MvxRootPresentationAttribute attribute = null)
        {
            base.SetWindowRootViewController(controller, attribute);
        }

        public override void Show(MvxViewModelRequest request)
        {
            var viewCreator = Mvx.Resolve<IMvxIosViewCreator>();

            var controller = (UIViewController)viewCreator.CreateView(request);
            Show((UIViewController)controller);
        }
        //public override void Show(IMvxIosView view) {

        //}

        public override void ChangePresentation(MvxPresentationHint hint) {

            ---
            ----
        }

        public override void Close(IMvxViewModel toClose) {

            ---
            ----
        }

        public void Show(UIViewController) {

         //if (viewController is IFlyoutNavigationControllerCapable) {
                //flyoutPresenter.Show(viewController, flyout);
            //}
            //else {
                //currentWindow.RootViewController = viewController;
                //navigationPresenter.Show(viewController, flyout);
            //}
    //Do your thing here.

        }

        public bool Close(FlyoutNavigationController flyout) {

---
----
        }
    }

在这里,您的兴趣点是加载新 ViewModel 时调用的“显示”方法覆盖。 这里有你想要展示的 rootviewController 和新控制器,所以我想你可以从这里获取它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多