Domanda

Sto lavorando su un'applicazione WPF e sto usando il modello Model-View-ViewModel.

Al momento l'applicazione è composta da due moduli:

  • Pannello sinistro per sfogliare un albero e selezionare un nodo
  • Pannello principale per mostrare il contenuto del nodo dell'albero selezionato.

Voglio mantenere separati questi due moduli, ma quando seleziono un nodo nel pannello sinistro ho bisogno di lanciare un evento a cui il pannello principale può iscriversi. Non voglio accoppiare il pannello sinistro e il pannello principale, quindi non voglio condividere istanze delle classi ViewModel.

In modo ottimale, mi piacerebbe usare Prism (WPF Composite Application Guidance), ma attualmente sto estendendo un'applicazione esistente e non posso introdurre più dipendenze. Il progetto è anche su .NET 3.0 (non 3.5), quindi dovrei riconvertire Prism in .NET 3.0 come è scritto per .NET 3.5.

In Prism lo risolverei usando l'infrastruttura di eventi Loosely Coupled. Ti consente di generare un evento in qualsiasi classe in qualsiasi livello e di ascoltare qualsiasi evento in qualsiasi classe in qualsiasi livello. Fondamentalmente l'editore e l'abbonato dell'evento sono disaccoppiati.

Uso i comandi per ottenere questo accoppiamento libero tra il mio View e il mio ViewModel, ma non sono sicuro di come effettuare una corretta comunicazione cross-View.

Eventuali suggerimenti o suggerimenti sono molto apprezzati.

Sto specificatamente cercando un modello davvero di pub / sub evento leggero per .NET 2.0 / 3.0 (niente roba LINQ), o qualcos'altro per implementare cross View (modulo ) comunicazione senza accoppiamento dei due moduli.

Aggiorna : ho finito per risolvere questo problema in modo simile a quanto suggerisce Glen. Ho un EventService separato (lo chiamo CommandProxy) e lo passo a tutti i ViewModel attraverso i costruttori nel mio localizzatore di servizi (al momento sto usando un Service Locator invece di un contenitore IoC). CommandProxy espone un set di MultiDelegateCommants, che è un'estensione del DelegateCommand in Prism (Composite WPF Guidance). In sostanza, consente comandi disaccoppiati dall'albero visivo e che supporta più abbonati.

È stato utile?

Soluzione

Hai un contenitore IoC? Un approccio semplice è quello di creare un servizio personalizzato che genera l'evento. Event Aggregator è generico, ma è possibile creare un servizio specifico che fa ciò che si desidera.

Ad esempio, creare un EventingService che ha un metodo OnNodeSelected. Tale metodo genera un evento NodeSelected che si blocca dal servizio. Il servizio viene quindi registrato nel contenitore IoC, consentendo a editori e abbonati di accedervi. In questo modo se si dice che MainPanel deve iscriversi, allora MainPanelViewModel verrà iniettato con EventingServiec nel suo costruttore. Si iscriverà quindi. Un altro approccio se si utilizza WPF è quello di estrarre CompositeCommand dal codice della libreria dell'app composita e fare in modo che il servizio di eventi esponga un CompositeCommand. Quindi ogni abbonato (Visualizza modello) registra il proprio comando con il servizio. Quando viene chiamato OnNodeSelected, viene richiamato l'esecuzione di CompositeCommand, avvisando in tal modo tutte le parti interessate.

Parliamo dell'utilizzo del proprio servizio per questo nei documenti per la Guida alle app composite all'indirizzo www.microsoft.com/compositewpf nella sezione Eventi allentati accoppiati nell'argomento Comunicazione. ( http://msdn.microsoft.com/en-us/library/cc707836 aspx ). Anche Francis Cheung ha un post su questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top