2011-10-19 3 views
1

WPFアプリケーションにモーダルダイアログを表示して、ユーザーがサーバーにログインできるようにしました。このダイアログには、すべてのログイン項目(UI、Webサービス呼び出し、呼び出しが返ってくるとルーティングされたイベントを呼び出す)を処理するユーザーコントロールが含まれています。メインウィンドウのモーダルダイアログから発生したバブリングイベントの処理

すべてがうまく動作し、ダイアログでイベントを処理できます(ログイン成功時にダイアログを閉じる)。しかし、私は主なアプリケーションでイベントを処理することができません(ユーザがログインした後はUIをリフレッシュする必要があります)。

このような経路指定されたイベントは、発生したウィンドウの外側で(たとえ可能な場合でも)傍受することができますか?可能でない場合、それを処理する通常の方法は何ですか?

答えて

2

ルーターされたイベントは、新しいウィンドウから所有者には送られません。 RoutedCommandsは直接動作しません。しかし、Bindingがうまくいきます!

childWindow.OwnerWindow = Application.Current.MainWindowを設定すると、childWindowは、OwnerWindowプロパティを使用して論理的にMainWindowに接続されます。

OwnerWindowのViewModelコマンドにバインドして実行することができます。

<Window x:Class="...ChildWindow" 
      ... > 
     <Button Command="{Binding Path=OwnerWindow.DataContext.SaveCommand, 
           RelativeSource={RelativeSource 
            AncestorType={x:Type Window}}}" 
       Content="Execute Owner's Save Command" /> 
    </Window> 
1

ルーティングされたイベントは、1つのウィンドウから別のウィンドウに移動することはありません。

子ウィンドウでパブリックCLRイベントを定義します。メインウィンドウが子をインスタンス化するとき、子を表示する前にそのイベントのハンドラを接続する必要があります。子供は、適切な時期にこのイベントを起こすだけです。

1

同じ論理ツリーにないので、異なるウィンドウ間でルーティングされたイベントを自動的にバブルする方法はわかりません。複雑なUIアプリケーションがこの種のビュー間通信を処理する方法は、EventAggregatorパターンの実装によって実現されます。したがって、ビュー間で多くのコミュニケーションが必要な場合は、これらを処理するためのきれいな方法になりますシナリオの種類。 PrismフレームワークにはEventAggregatorの実装が含まれていますが、単純なシナリオで手書きのものは必要に応じて難しくありません。

関連する問題