Caliburn comes with several types of conductors out of the box. One explorer without a set of elements (but ActiveItem) and several explorer with collections of elements and ActiveItem.
Of course, you could also implement your own explorer, but here it does not seem necessary. It sounds like you just want your ShellViewModel be a conductor, perhaps the one with the collection of items it holds makes the most sense, so you can get the ShellViewModel from Conductor<IScreen>.Collection.OneActive .
You donโt need to keep any items on the menu, maybe you just need a link to the Items collection on your ShellViewModel . In your ShellViewModel constructor ShellViewModel you can instantiate each of the view models that appear on the menu (perhaps using an abstract factory would be the most enjoyable way), and then pass the Items link to the MenuViewModel .
Each element that your ShellViewModel can be obtained from Screen , so that they have a normal screen life cycle ( OnActivate , OnDeactivate , etc.). Your MenuViewModel not running and does not require a screen life cycle, so it can simply be inferred from PropertyChangedBase .
With Caliburn.Micro, whenever you have a ContentControl on your view with the same name as a property in your view model, whose value is itself a view model, then Caliburn.Micro will detect this view of view models and add this in ContentControl, and take care of the bindings too.
Thus, your ShellViewModel may have a MainMenu property of type MenuViewModel , and your shell view looks something like this:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="200" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> </Grid> <ContentControl x:Name="MainMenu" Grid.Column="0" /> <ContentControl x:Name="ActiveItem" Grid.Column="1" />
source share