Ответ 1
Мы постоянно сталкиваемся с этой ситуацией в нашем приложении. Для этого мы используем свойство Window.Owner и свойство ICommandSource.CommandTarget.
Например, в окне A:
DialogWindow windowB = new DialogWindow();
windowB.Owner = this;
windowB.ShowDialog();
Затем в DialogWindow все элементы управления, выполняющие команды, имеют свой CommandTarget, привязанный к родительскому владельцу окна:
<Window x:Class="DialogWindow" x:Name="wnd">
<Button Command="SomeCommand" CommandTarget="{Binding Owner, ElementName=wnd}"/>
</Window>
Или, альтернативно, если вы выполняете код внутри окна B:
SomeCommand.Execute(params, this.Owner);
CommandTarget позволит Window A прослушивать CanExecute и Execute.