Quello che stai chiedendo non è propriamente MVVM dato che dovresti rappresentare ogni tab con il suo ViewModel e mettere in una lista che è in binding poi sul TabControl. In questo modo non aggiunge la tab da codice nella view, ma lavori sempre a livello di ViewModel.
Di conseguenza anche la comunicazione dev'essere fatta tra ViewModel. Quello rappresentante la tab può semplicemente avere un riferimento al VM principale e invocare su di esso metodi che rappresentano il comando.
Per quello che chiedi inverti il senso. Fai che il VM principale monitorizza i VM figli in modo che lui sappia quando un'ipotetica proprietà SelectedContract cambia così lui può conoscere se è valido o meno e invalidare il comando.
Per questo genere di cose prova a guardare questo articolo
http://www.winfxitalia.com/articoli/presentation-foundation/architettura-model-view-viewmodel-wpf-problemi-comuni.aspx