ShowDialogで開いたウィンドウがビジュアルツリーでどのように扱われるのか疑問に思いました。
たとえば、ウィンドウAはShowDialogを介してウィンドウBを開きます。ウィンドウBでルーティングされたコマンドを実行すると、ウィンドウAはコマンドを受信しません(コマンドをリッスンしている場合でも)。
これを機能させる方法はありますか?
ありがとう!ジョン
ShowDialogで開いたウィンドウがビジュアルツリーでどのように扱われるのか疑問に思いました。
たとえば、ウィンドウAはShowDialogを介してウィンドウBを開きます。ウィンドウBでルーティングされたコマンドを実行すると、ウィンドウAはコマンドを受信しません(コマンドをリッスンしている場合でも)。
これを機能させる方法はありますか?
ありがとう!ジョン
私たちのアプリケーションでは、常にこの状況に遭遇します。これには Window.Owner プロパティと ICommandSource.CommandTarget プロパティを使用します。
たとえば、ウィンドウ A では次のようになります。
DialogWindow windowB = new DialogWindow();
windowB.Owner = this;
windowB.ShowDialog();
次に、DialogWindow で、コマンドを実行するすべてのコントロールの CommandTarget が親 Window の Owner にバインドされます。
<Window x:Class="DialogWindow" x:Name="wnd">
<Button Command="SomeCommand" CommandTarget="{Binding Owner, ElementName=wnd}"/>
</Window>
あるいは、ウィンドウ B 内のコードから実行している場合:
SomeCommand.Execute(params, this.Owner);
CommandTarget は、ウィンドウ A に CanExecute と Execute をリッスンさせます。