2012-04-06 6 views
1

私はウィンドウを持っていて、そのdatacontextはビューモデルです。今、VMとウィンドウ(ビュー)の範囲外に、私は呼び出されるメソッドがあります。このメソッドはウィンドウを表示してユーザーに何かを変更させる必要があり、ユーザーが完了すると、ウィンドウを閉じてメソッドを続行する必要があります。トリッキーなことは、私はウィンドウ上のボタンをviewmodelのコマンドにバインドしている。これらのコマンドは 'userCancelled'や 'userOked'のようなイベントを発生させます。だから私はこれらのイベントをキャッチして、いつウィンドウを閉じてメソッドを続けるかを知りたい。ウィンドウが閉じるのを待ってウィンドウイベントをキャッチします。

私はShowDialogを使用する場合、イベントはキャッチされません(私はスレッドが閉じてダイアログを待っているので結構です)。しかし、私がショーを使用する場合、メソッドはロールオーバーします。私はそれを待つ必要がある。私はいくつかのブール値がオンに切り替わるまでThread.Sleepを試しましたが、それもスレッドを結びつけて、ウィンドウを使用不可能にします(.Show()を使用します)。

私はbackgroundWorkerを作成しようとしましたが、私はまだ同じ問題を抱えています。

私はボタン上でコードビハインドを使用することができますが、OKボタンの場合、viewModelはその状態が有効であることを確認する必要があります。 viewmodelとの協議は、MVVMの疎結合スタイルのポイントを打ち負かしていますか?

私は自分でWPFとMVVMを学習しています。私はそれを正しく行い、実用的なところで良いデザインの校長に固執したいと思います。私はこれをどのようにすべきですか?私は間違って何をしていますか?ありがとう。

+0

今、私はちょうどViewModelにWindowプロパティを追加しました。私はwindow.close()を必要に応じてviewmodelで呼び出しています。私はMVVMでこれを行う "正しい"方法を知りたいです。 –

+0

update:ビューモデルにCloseWindowアクションを作成し、ウィンドウとビューモデルを結びつけると、そのアクションを匿名デリゲートを使ってウィンドウのClose()メソッドと同じに設定すると、時間が許せばプリズムについて学習します。 –

答えて

1

PrismWindowRegionAdapterを使用してください。

  1. WindowRegionAdapterで表示/非表示にするビュー(ユーザーコントロール)を登録すると、ビューが要求されたときに新しいウィンドウが開きます。
  2. ビューの表示/非表示/閉じるのCompositePresentationEventを作成し、共通のインフラストラクチャアセンブリに配置します。
  3. ビューを含むモジュールのInitializeメソッドで、2で作成したイベントにサブスクライブし、OnShow/OnHide/OnCloseイベントハンドラにリンクします。
  4. イベントハンドラでは、プリズム領域マネージャを使用して領域からビューを追加/削除し、領域を表示/非表示/閉じることができます。 WindowRegionAdapterを変更して、それがしたいことを正確に行うことができます。
  5. 次に、ビューを表示/非表示にしたいときは、適切なshow/hideイベントを任意の場所(モジュール/ビューモデルのいずれか)に公開するだけで、適切なイベントハンドラがイベントにサブスクライブするモジュールで呼び出され、ウィンドウが非表示になります。

はい、少し複雑ですが、特に他のウィンドウを開く必要がある場合は特に投資価値があります。物事をきれいに保ちます。

+0

今プリズムで勉強しています。先端に感謝します。私はそれに夢中になるための任意の推奨チュートリアル? –

+0

[この質問](http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish)のリンクをご覧ください。 – NVM

関連する問題