Richiama la logica del modello in un UserControl da view-model in un altro UserControl senza violare MVVM

2

Ecco l'applicazione WPF composta dal 3% di% di sconto:

UserControl è una parte del contenuto di UserControl3 . Tengo MVVM durante lo sviluppo e l'utilizzo di Prism .

Devo invocare il metodo di classe personalizzato (che è modello in termini di MVVM) in UserControl2 da modello di vista di UserControl3 . La restrizione che il servizio in UserControl1 non può essere singleton. Suppongo di farlo in uno dei seguenti modi:

  1. Uso di un aggregatore di eventi da Prism. UserControl3 view-model è publisher e UserControl1 model è subscriber. Per questo dovrò creare un ID univoco in UserControl3 e passarlo a Window e UserControl1 .

  2. Creazione dell'istanza del servizio in UserControl3 e passaggio a Window e UserControl1 . Quindi UserControl3 invoca semplicemente il metodo su questa istanza.

  3. UserControl1 passa Window istanza a UserControl2 . Il modello di vista in UserControl1 invocherà solo il metodo UserControl1 , che invocherà il metodo UserControl2 e così via.

Sembra che gli approcci 2 e 3 violino MVVM. Cosa preferiresti?

    
posta Sam 01.09.2016 - 11:45
fonte

2 risposte

1

Questa domanda, pur concentrandosi principalmente sulle applicazioni WPF, si applica ugualmente a qualsiasi applicazione della GUI.

Quando hai due parti diverse dell'interfaccia utente che devono interagire, ti restano davvero due soluzioni possibili:

  1. Eventi , che definisci come soluzione n. 1. Il vantaggio qui è che l'editore e il sottoscrittore sono disaccoppiati e non devono conoscere la struttura dell'interfaccia utente per fare il loro lavoro. Lo svantaggio qui è che abbonato ed editore sono disaccoppiati, rendendo più difficile il debug dei problemi dell'interfaccia utente.

  2. Composition (in termini orientati agli oggetti). Hai bisogno di incapsulare la logica in qualche modo. Se questa logica è puramente logica UI, un controllo utente potrebbe avere un riferimento diretto a un altro, se e solo se la struttura dell'interfaccia utente faciliterà ora e per sempre questa relazione tra oggetti.

    Se i due Controlli utente non sono in grado di conoscere la struttura della loro finestra di contenimento, vai con l'opzione # 1 sopra.

    Se la logica non è la logica dell'interfaccia utente, allora funzionerà una classe di servizio iniettata in ciascun controllo utente al momento della creazione dell'oggetto (noto anche come Iniezione delle dipendenze).

La mia preferenza è di utilizzare eventi o messaggi tra due componenti dell'interfaccia utente. Un evento può essere generato dall'utente o dall'applicazione.

    
risposta data 01.09.2016 - 18:40
fonte
1

Uso MVVMLight e invierò un messaggio di notifica che il mio controllo riceverà e quindi registrerà il record di servizio. Come sparare a un evento in prisma.

    
risposta data 01.09.2016 - 17:33
fonte

Leggi altre domande sui tag