Ответ 1
В MvvmCross v3 мы предоставили конкретный механизм, позволяющий ViewModels отправлять сообщения в пользовательский интерфейс, чтобы они хотели изменить текущую презентацию.
Этот механизм ChangePresentation(MvxPresentationHint hint)
и обеспечивает маршрутизацию сообщений - подсказки представления - от ViewModels
до Presenter
.
Как Presenter
обрабатывает эти сообщения, зависит от платформы и приложения.
Этот механизм сообщений очень общий, и он может использоваться для всех видов в будущем - например, разработчики могут предлагать подсказки, которые делают такие вещи, как изменение макета пользовательского интерфейса, которые выделяют часть пользовательского интерфейса, которые заставляют пользователя сосредоточиться на определенном элементе управления, что приводит к отображению или скрытию SIP и т.д.
В случае закрытия модели представления мы предоставили специализацию MvxPresentationHint
- MvxClosePresentationHint
- и вспомогательный метод в базовом классе MvxViewModel
:
protected bool Close(IMvxViewModel viewModel)
{
return ChangePresentation(new MvxClosePresentationHint(viewModel));
}
Чтобы использовать это, ViewModel может просто вызвать Close(this)
Когда это вызывается, презентатор в вашем пользовательском интерфейсе получит сообщение по методу ChangePresentation
:
public interface IMvxViewPresenter
{
void Show(MvxViewModelRequest request);
void ChangePresentation(MvxPresentationHint hint);
}
Для общего/типичного случая, когда закрываемый ViewModel
прикрепляется к представлению, которое является самым верхним Activity
/Page
/UIViewController
, ведущие по умолчанию в MvvmCross смогут обрабатывать это сообщение и сможет GoBack
в Windows, Finish
в Android и PopViewController
в iOS.
Однако, если ваш пользовательский интерфейс более сложный, чем тот, например. если ViewModel
, который вы хотите Close
, действительно соответствует Tab
, a Flyout
, a SplitView
и т.д., или если ViewModel
соответствует чему-то другому, кроме текущего верхнего вида в иерархия - тогда вам нужно будет предоставить пользовательскую реализацию презентатора - и для реализации этой задачи потребуется обработать платформу и конкретную прикладную логику для обработки Close
.
Вышеуказанный совет - это то, что я рекомендую вам использовать...
Однако, как альтернативный:
Если бы вы почувствовали, что этот механизм ChangePresentation(MvxPresentationHint hint)
был просто слишком тяжелым/избыточным для вашего приложения, то вы также можете, конечно же, перейти к настраиваемому или Message
механизму.
Один образец, который делает это, представляет собой образец CustomerManagement - он предоставляет пользовательскую реализацию IViewModelCloser на каждой платформе - см.:
- пользовательский интерфейс - https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement/Interfaces/IViewModelCloser.cs
- BaseViewModel - https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement/ViewModels/BaseViewModel.cs
- Droid - https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement.Droid/SimpleDroidViewModelCloser.cs
- WP - https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement.WindowsPhone/ViewModelCloser.cs
- Touch - https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement.Touch/CustomerManagementPresenter.cs