Маршрутизированные команды WPF и окна ShowDialog

Мне было интересно, как окно, открытое через ShowDialog, обрабатывается в визуальном дереве.

Например, окно A открывает окно B через ShowDialog. При запуске маршрутизируемой команды в окне B окно A не получает команду (даже если она ее прослушивает).

Есть ли способ сделать эту работу?

Спасибо! Джон

Ответ 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.