1

ウィンドウがあり、そのデータコンテキストはビューモデルです。これで、vmとwindow(view)のスコープ外に、呼び出されるメソッドがあります。メソッドはウィンドウを表示し、ユーザーにいくつかの変更を許可する必要があります。その後、ユーザーが完了したら、ウィンドウを閉じてメソッドを続行する必要があります。トリッキーなことは、ビューモデルのコマンドにバインドされたウィンドウ上のボタンがあることです。これらのコマンドは、「userCancelled」や「userOked」などのイベントを発生させます。したがって、これらのイベントをキャッチして、ウィンドウを閉じてメソッドを続行するタイミングを知りたいと思います。

ウィンドウでShowDialogを使用すると、イベントがキャッチされません(スレッドが拘束され、ダイアログが閉じるのを待っているためだと思います)。しかし、Showを使用すると、メソッドはロールオンします。待つ必要があります。ブール値がオンになるまでThread.Sleepを試しましたが、スレッドも拘束され、ウィンドウが使用できなくなります(.Show()を使用)。

backgroundWorkerを作成しようとしましたが、それでも同じ問題が発生します。

ボタンでコードビハインドを使用できることは理解していますが、[OK]ボタンの場合、viewModelはその状態が有効であることを確認する必要があります。ビューをビューモデルとコンサルトさせることは、MVVMのルーズカップリングスタイルのポイントを打ち負かしますよね?

私はWPFとMVVMをすべて自分で学んでいます。それを正しく行い、実用的な場合は優れた設計原則に固執したいと思います。どうすればいいですか?私は何が間違っているのですか?ありがとう。

4

1 に答える 1

1

これは、 PrismWindowRegionAdapterを使用して正しく行うことができます。

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

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

于 2012-04-06T14:49:59.963 に答える