MvvmCross CloseTo ViewModel

#xamarin #mvvmcross

#xamarin #mvvmcross

Вопрос:

В MvvmCross есть ли способ попросить службу навигации закрыть определенную ViewModel?

Например, допустим, у меня есть 3 модели просмотра

A B C

Я перешел от A к B к C.

A -> B -> C

В представлении C я нажимаю кнопку Готово и хотел бы вернуться к просмотру A.

Есть ли способ сделать что-то подобное в ViewModel C?

_navigationService.Close<A>(this);

Комментарии:

1. IMvxNavigationService Close приведет к закрытию конкретной viewmodel. Пожалуйста, проверьте ссылку ниже. github.com/MvvmCross/MvvmCross/pull/3063

2. @WendyZang-MSFT Вы предлагаете мне просто вызвать close для всех ViewModels, которые я хочу закрыть в ViewModel C?

Ответ №1:

если вы подключены Xamarin.Forms (если нет, дайте мне знать, и я обновлю ответ, потому что это не так просто), в IMvxNavigationService у вас есть ChangePresentation(...) метод, который использует объект подсказки, чтобы сообщить платформе, что вы хотите сделать.

  Task<bool> ChangePresentation(MvxPresentationHint hint, CancellationToken cancellationToken = default(CancellationToken));
  

Здесь у вас есть различные готовые подсказки, которые предоставляет платформа.

Для решения вашей проблемы вы можете просто использовать MvxPopPresentationHint :

 _navigationService.ChangePresentation(new MvxPopPresentationHint(typeof(A)));
  

или, если A это ваша корневая ViewModel, вы можете просто использовать MvxPopToRootPresentationHint :

 _navigationService.ChangePresentation(new MvxPopToRootPresentationHint());
  

ПРИВЕТ

Комментарии:

1. Я не использую формы. Я использую Android и iOS.

2. Похоже, вам нужно подклассировать презентеров platform view для iOS / Android, если вы хотите это сделать. Я отмечаю этот ответ как правильный, поскольку на данный момент решения на самом деле нет. github.com/MvvmCross/MvvmCross/issues/4032

3. да, вам нужно создать подкласс view presenter на платформе и отправить пользовательскую подсказку. Который затем, в зависимости от подсказки, вы реализуете закрытие на каждой платформе. Извините, что не ответил раньше. Если у вас возникнут какие-либо проблемы с этим, дайте мне знать, и я завершу ответ, как только смогу