12

MVVM-Lightに基づくアプリケーションを構築しています。同じビューの複数のインスタンスを作成する必要があり、それぞれが独自のViewModelにバインドする必要があります。

デフォルトViewModelLocatorでは、ViewModelsがシングルトンとして実装されているため、同じViewの異なるインスタンスが同じViewModelにバインドされます。

VMLocatorでViewModelを非静的オブジェクトとして作成することもできますが(new VM()...を返すのと同じくらい簡単です)、それは部分的にしか役に立ちません。実際、開いているウィンドウを追跡する必要があります。それでも、各ウィンドウは他のいくつかのウィンドウを開く可能性があります(ただし、種類は異なります)。この状況では、親ビューとそのすべての子に対して何らかの操作を実行する必要がある場合があります。たとえば、ビューPを閉じる前に、そのすべての子(ビューC1、ビューC2など)を閉じたい場合があります。

したがって、これを達成するための簡単で簡単な方法はありますか?または、従うようにアドバイスするベストプラクティスはありますか?

貴重なご協力をよろしくお願いいたします。

乾杯、
ジャンルカ。

4

3 に答える 3

11

ViewModels を ViewModelLocator にシングルトンとして格納する義務はありませんが、ビューもシングルトンである場合、確実に見つけやすくなります。明らかに、同じ View クラスの複数のインスタンスがある場合、同じ ViewModel クラスの複数のインスタンスが存在することになり、シングルトンになることはできなくなります。

ViewModel の複数のインスタンスを追跡するために、キーに従って ViewModel を検索する ViewModelLocator にディクショナリを実装できます。たとえば、キーはビューの一意の ID にすることができます。ビューを取得したら、そのキーを取得し、ロケーターからビューモデルを取得します。

更新: 多くの場合、複数のビューモデルを追跡する必要さえありません。たとえば、Send オーバーロードを使用して、Messenger クラスから特定のビューモデル クラスのすべてのインスタンスにメッセージを送信することができます。したがって、VM を追跡するためのディクショナリを実装する前に、それが本当に必要かどうか自問してください。;)

お役に立てば幸いです、ローラン

于 2010-05-17T09:59:04.513 に答える
0

この SO questionで問題を投稿して解決しました。ここでの Bugnion 氏の回答に非常に関連していることが判明しました (これは私を大いに助けてくれました、ありがとう!)

私が見つけたのは、view-model プロパティを ViewModelLocator にまったく格納する必要がないということです。を使用ServiceLocatorしてキーを持つインスタンスを作成し、「ダイアログ サービス」でキーを に渡しますShowDialog<T>(string key = null)

また、このスレッドで既に述べたように、 method を使用し、後で をMessenger.Default.Send呼び出すことを忘れないでください。viewModel.Cleanup()Messenger

于 2014-06-05T12:55:28.227 に答える
0

Unity コンテナーの命名システムを使用しました。

「ユニティコンテナを使用して複数のビュー/ビューモデルのペアを区別する方法」を参照してください。

于 2012-04-03T11:34:59.213 に答える