In MvvmCross v3, abbiamo fornito un meccanismo specifico per consentire a ViewModels di inviare messaggi all'interfaccia utente che vorrebbero modificare la presentazione corrente.
Questo meccanismo è ChangePresentation(MvxPresentationHint hint)
e fornisce il routing dei messaggi - suggerimenti di presentazione - da ViewModels
a Presenter
.
Come il Presenter
gestisce questi messaggi è specifico per la piattaforma e l'applicazione.
Questo meccanismo di messaggio è molto generale e potrebbe essere utilizzato per tutti i tipi di cose in futuro - ad es. gli sviluppatori potrebbero fornire suggerimenti che fanno cose come cambiare il layout dell'interfaccia utente, che evidenziano parte dell'interfaccia utente, che costringono l'utente a concentrarsi su un determinato controllo, che fa sì che il SIP venga visualizzato o nascosto, ecc.
Per il caso di chiusura di un modello di vista, abbiamo fornito una specializzazione delle MvxPresentationHint
-MvxClosePresentationHint
- ed un metodo di supporto in una classe base di MvxViewModel
:
protected bool Close(IMvxViewModel viewModel)
{
return ChangePresentation(new MvxClosePresentationHint(viewModel));
}
Per utilizzare questa un ViewModel può basta chiamare Close(this)
Quando questo viene chiamato, il presentatore all'interno della vostra interfaccia utente riceverà un messaggio sul metodo ChangePresentation
:
012.351.641.061.
public interface IMvxViewPresenter
{
void Show(MvxViewModelRequest request);
void ChangePresentation(MvxPresentationHint hint);
}
Per il caso generale/tipico - dove il ViewModel
che viene chiuso è attaccato alla vista che è più in alto Activity
/Page
/UIViewController
, presentatori predefinite all'interno MvvmCross saranno in grado di gestire questo messaggio e potranno a GoBack
in Windows, a Finish
in Android ea PopViewController
in iOS.
Tuttavia, se l'interfaccia utente è più complicata di quella - ad es. se lo ViewModel
corrisponde a Tab
, a un Flyout
, a un riquadro SplitView
, ecc. o se lo ViewModel
corrisponde a qualcosa di diverso dalla vista corrente più alta nella gerarchia, sarà necessario fornire un presentatore personalizzato implementazione - e che l'implementazione dovrà fare la logica specifica della piattaforma e dell'applicazione per gestire lo Close
.
È possibile che questo suggerimento è quello che vi consiglio di utilizzare ...
Tuttavia, come alternativa :
Se si dovesse sentire questo meccanismo ChangePresentation(MvxPresentationHint hint)
era semplicemente troppo pesante/eccessivo per la tua app, quindi puoi anche, naturalmente, scendere a un meccanismo basato su custom o Message
.
Un campione che fa questo è il campione CustomerManagement - fornisce un'implementazione IViewModelCloser personalizzato su ogni piattaforma - vedi:
Vedo e come hai detto tu potresti ereditare da un presentatore di piattaforme, ignorare ChangePresenter e dire a Mvx di usare il nuovo presentatore. –