I have an application where I have a main viewmodel whose view contains a tabcontrol, where each tab has its own view and viewmodel (and possibly more of them). I believe this is a pretty common design. Now, I want to open new tabs (by instantiating new viewmodels and adding them to the collection of workspaces) by firing commands from controls inside those tabs. The problem is that the command is received by the inner viewmodel, that controls the tab, not the outer one that controls the tabcontrol. What would be the best practice to do this? All the solutions I can think of are kind of “hacky” (giving the viewmodel a reference to its parent viewmodel, subscribing to a child’s event from the parent…). I am assuming there is a nice solution for this.
For example, from a “list of entities” view, clicking the “new” button or selecting a row should open another tab with an “entity details” type of view. However, the command will be received by the “list of entities” view’s viewmodel, to whom the tab is bound, and not the “list of workspaces” viewmodel to whom the tabcontrol is bound.
One possibility is to have your outer viewmodel expose a command to create a new tab. We use a centralized CommandService, which is simply a dictionary of name-to-ICommand, which allows for decoupled global commands. Something like this: