Я (вроде) делаю это прямо сейчас.
У меня есть ConsoleViewModel, которая записывает и сохраняет события от исполнения для отображения в пользовательском интерфейсе в моем ConsoleView.Естественно, мои ViewModels хотят взаимодействовать с этой консолью, чтобы записывать их события.
Для этого я создал интерфейс, который предоставляет методы, которые мои ViewModels могут использовать для записи своих событий в консоль.
public interface IConsole
{
void Info(string message);
void Info(string messageFormat, params object[] args)
// etc
}
Мой ConsoleViewModel реализует этот интерфейс, а все другие ViewModel предоставляют открытое свойство типа IConsole, которое они используют для записи в консоль.
При этом вы можете использовать множество методов компоновки.ваши ViewModels.Вы можете использовать DI, или простой сервисный локатор, или (как я уже сделал) определить их в ресурсе.
<Application.Resources>
<ConsoleViewModel x:Key="ConsoleViewModel" />
<DerpViewModel x:Key="Derp"
Console="{StaticResource ConsoleViewModel}" />
<!--etc-->
</Application.Resources>