IntroduzioneViewModels che parlano tra di loro senza un quadro
Ho un'applicazione che importa i dati degli strumenti di laboratorio mentre è in esecuzione. Questi dati vengono importati e quindi visualizzati in un ListView
a un intervallo impostato dall'utente finale secondo i suoi requisiti di test. Quando un valore di interesse appare in questo ListView
da loro guardato, quindi premere un pulsante Start e l'applicazione inizia a eseguire calcoli su quel dato e sui dati successivi finché non viene premuto un pulsante Stop. Quindi sul lato sinistro dello schermo c'è una vista per la visualizzazione dei dati importati e sul lato destro c'è un'altra vista per osservare i valori e le statistiche mentre vengono calcolati e visualizzati.
il codice corrente
The View che consente di visualizzare il ListView in cui i dati vengono importati è l'ImportProcessView.xaml e pone la sua DataContext
al ImportProcessViewModel.cs
. La VM che ho appena introdotto ha una proprietà ObservableCollection<IrData>
che il ListView, ho anche appena descritto, si lega a. Ora per la parte interessante ...
Il ImportProcessView
ha un ContentControl
che imposta dinamicamente il contenuto di un UserControl che rappresenta i controlli e i campi specifici per il tipo di Fase scelto dall'utente finale.
<StackPanel Background="White" Margin="5">
<ContentControl Content="{Binding CurrentPhaseView}"/>
</StackPanel>
ci sono tre PhaseViews
, ciascuno nel proprio controllo utente e ogni imposta è DataContext
al ImportProcessViewModel
. Di conseguenza sto ottenendo un rigonfiamento della VM grave per un totale di 2000 linee. Ridicolo. Lo so. Il motivo per il rigonfiamento è dovuto al fatto che lo ImporProcessViewModel
sta mantenendo lo stato tramite le proprietà per ciascuna delle tre PhaseViews e non solo, ma contiene metodi per eseguire calcoli i cui dati sono memorizzati e visualizzati in queste "PhaseViews".
Quello che sto cercando di realizzare
Ovviamente prima della ImportProcessViewModel
diventa più pesante, ho bisogno di disgregare in modo che ogni PhaseView ha il suo ViewModel, ma anche in modo tale che ogni ViewModel mantiene un rapporto di nuovo a ImportProcessViewModel a causa della dipendenza imposta dalla ObservableCollection di IrData
.
R & D
ho fatto la mia ricerca su ViewModels comunicanti tra loro, ma la maggior parte del results coinvolgere le applicazioni che sono state scritte con un quadro MVVM specifica. Non sto usando un framework e, a questo punto del progetto, sarebbe troppo tardi per refactoring per iniziare a usarne uno.
Tuttavia, ho trovato questo article e la risposta offerta da "hbarck" suggerisce qualcosa di semplice come la composizione per ottenere il risultato desiderato, ma poiché non ho molta esperienza con DataTemplates, non capisco cosa sia significa quando lui/lei suggerisce di esporre "ViewModel di UserControl come una proprietà sul ViewModel principale, e associare un ContentControl a questa proprietà, che quindi istanziare la Vista (es.l'UserControl) attraverso una DataTemplate"
In particolare, non capisco cosa si intende per "associare un ContentControl a questa proprietà, che sarebbe poi un'istanza Vista attraverso una DataTemplate".
Can qualcuno chiarire a titolo di esempio di codice cosa si intende per un'istanza di una vista attraverso un DataTemplate nel contesto di questo esempio?
Inoltre, questo è un buon approccio (come suggerito da 'hbarck')?
Come si può vedere, sto già impostando la proprietà Content di un ContentControl nella Phase View che deve essere istanziata. Solo che non so come si presenterebbe un DataTemplate.
Benjamin già detto everthing c'è a questo argomento. ma ecco un altro esempio: http://www.codeproject.com/Articles/35277/MVVM-Mediator-Pattern. – Egi