Quando utilizzare il modello di Messenger (Mediatore) nel design MVVM

1

Mi sono confuso con il ruolo di Messenger in MVVM. Vedo articoli contraddittori a riguardo.

Questo articolo da MSDN di:

Communicating from the View-Model to the View
Observant readers will notice that Figure 1 has one arrow missing: in this figure, there is no way for the View-Model to communicate with the view. As mentioned earlier, the View-Model should ideally have no knowledge of the view that it is attached to. In fact, it is very common for a given View-Model to be attached to multiple views—for instance, because one view might become too complex and be split into two pages. To guarantee flexibility, the View-Model must have only an abstracted knowledge of what the view can do.
There are multiple ways to solve this issue. The two solutions that I propose here are using MVVM Light’s Messenger class and using view services.

generalmente dicendo che i messaggi dovrebbero essere dal modello di vista alla vista nel caso sia necessario.

Anche in questo articolo, avverte l'utilizzo del Messenger in quanto causa la minore leggibilità del codice (che sono d'accordo).

Ma su Un altro articolo
È usato in modo diverso per comunicare messaggi tra View-Models

UML Diagram showing Messenger communication between View-Models

In questo scenario, non viene visualizzato il messaggio "Perché VM non può fare riferimento a un'altra VM?"
come il View-Model referenziato può essere facilmente deriso e testato.

    
posta Tomer W 30.10.2018 - 18:09
fonte

1 risposta

3

Queste spiegazioni sono un po 'confuse sì.

Tecnicamente, il modello di mediatore non cambia sostanzialmente nulla delle relazioni tra i tuoi oggetti. Ciò che fa è rendere più facile la composizione di più componenti.

Diciamo che ho una pagina con 3 componenti

  • Shopping bag : mostra i prodotti selezionati
  • Contenuto principale : mostra l'elenco di prodotti
  • Barra laterale : mostra le offerte speciali

Ora. quando faccio scorrere il contenuto principale, voglio che la barra laterale si aggiorni con le offerte speciali relative ai prodotti che sto guardando. Quando clicco su un prodotto nel contenuto principale o nella barra laterale, lo voglio aggiungere alla shopping bag.

Potrei avere un ViewModel globale per la pagina che conosce tutti e tre i controlli e lega la logica a ciascuno dei loro eventi in modo che queste azioni avvengano. Ad esempio, mainContent.ProductSelected e sidebar.ProductSelected potrebbero essere associati a una funzione che chiama shoppingBag.AddProduct() .

Ma con lo schema Mediatore, ciascun controllo può legarsi agli eventi che il Mediatore solleva. La borsa della spesa può associarsi all'evento "prodotto selezionato" e non importa se il contenuto principale o la barra laterale sta sollevando l'evento.

Ciò semplifica l'aggiunta di un quarto controllo che ha anche un evento "prodotto selezionato". Non è necessario collegarlo esplicitamente a tutti gli altri controlli che potrebbero voler fare qualcosa quando si verifica quell'evento. Devi solo inviare l'evento al Mediatore.

    
risposta data 30.10.2018 - 19:15
fonte

Leggi altre domande sui tag