Penso che la sua cattiva pratica di avere un God ViewModel, il ViewModel più in alto, chiamiamolo MainWindowViewModel
, dovrebbe contenere solo dati e comportamenti accoppiati a quelli della MainWindow, che di solito è molto sottile, tutti gli altri lavori dovrebbero essere delegati a submodels.
Se hai un gestore di docking o un'altra logica di gestore di finestre, il codice dovrebbe risiedere in MainWindowViewModel
.
Ecco un esempio di un ViewModel che ho creato che delega il comportamento ai sotto-modelli
link
Non penso che sia una buona pratica passare i dati ai sotto-modelli, crea dipendenze tra i modelli. È preferibile utilizzare un modello di aggregazione degli eventi, in questo modo tutti i modelli interessati alla modifica dei dati possono iscriversi all'evento.
Aggiornamento : ho apportato un miglioramento al mio modello di finestra principale, invece del costruttore che ha preso tutti i modelli di vista secondaria ora prende una collezione di modelli viewmodels. E poi configuro IoC per iniettare modelli corretti
private void ConfigurePanels()
{
kernel.Bind<PanelViewModel>().To<ConsoleViewModel>();
kernel.Bind<PanelViewModel>().To<ErrorsViewModel>();
kernel.Bind<PanelViewModel>().To<WatchesViewModel>();
}
Questo rende il modello principale un po 'meno accoppiato ai sub-modelli, prima di cambiare
public MainShellViewModel(ConsoleViewModel consoleViewModel,
ErrorsViewModel errorsViewModel,
WatchesViewModel watchesViewModel
)
: base(resultFactory)
{
Tools = new BindableCollection<PanelViewModel> {consoleViewModel, errorsViewModel, watchesViewModel};
}
e dopo
public MainShellViewModel(IEnumerable<PanelViewModel> panels)
: base(resultFactory)
{
Tools = new BindableCollection<PanelViewModel> (panels);
}
link