Перейдите к ViewModel из текущего представления вместо RootView - PullRequest
0 голосов
/ 11 сентября 2018

Есть ли способ перейти к ViewModel из моего текущего представления вместо корневого представления?

Я создал модель представления, которая представлена ​​модально из корневого представления, и хочу представить модель представления в этом представлении.

Например, при вызове _navigationService.Navigate<MyViewModel>(); из моего модального представления, корневое представление переходит к MyViewModel вместо текущего модального представления. Это оставляет мой модальный экран с пустой страницей, пока вы не отклоните его и не увидите, что навигация произошла ниже.

Могу ли я создать собственную навигацию или есть способ лучше?

EDIT

Вот код:

Модель My View

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

My View

 [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 в представленном модале.

1 Ответ

0 голосов
/ 11 сентября 2018

Для этого вида настройки вам может понадобиться написать собственного докладчика, и вы сможете поиграть, чтобы добиться всего, чего вы можете достичь с помощью native.

Я пропускаю некоторую подсказку.

В 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) {

---
----
        }
    }

Здесь вас интересует переопределение метода "show", которое вызывается при загрузке нового ViewModel.Здесь у вас есть rootviewController и новый контроллер, который вы хотите представить, поэтому я думаю, вы можете взять его отсюда.

...