TabController for handling opening and closing of tabs
public TabsOpen(ViewModel vm)
    : base(vm)
{
    this.vm = vm;
}



There's no reason to set this.vm = vm here. You're already doing that by passing the argument to your base class' constructor. Both of your subclass ctors could look like this. 

public TabsOpen(ViewModel viewModel)
  : base (viewModel) { }


I changed the parameter name to make it a bit clearer. Speaking of naming, it's a convention in C# to PascalCase method names. You've camel cased yours. It's consistent though, so I can't gripe too much about it. 

To address your actual question though, typically yes, you will pass your view model to the controller as you've done here. However, that's because the controller is typically updating the view. That doesn't seem to be the case here, so the thought comes to mind that it is better to only inject what you actually need. 

I like that you've used polymorphism to simulate the state of an object, but it makes me wonder if what you have here is really a view model and not some other concept.