1

ロケーター パターンと MVVM-Light ライブラリを使用するように変換しようとしている既存の Silverlight 4 アプリケーションがあります。

私の理解では、MvvmLocator クラスは各ビュー モデルへの参照を保持し、各ビューの DataContext をロケーター内の適切な ViewModel にバインドできるようになっています。

私のアプリケーションはナビゲーション フレームを使用するため、アプリの各ページはコンテンツ フレームに読み込まれる UserControl です。

各ページ ビューをロケーターの適切な ViewModel にバインドするのがいかに簡単かはわかりますが、私の問題は、複数のコンテキストで再利用される独自のビュー モデルを持つ他の UserControls があり、各インスタンスがのコントロールが同じ究極のビュー モデル インスタンスにバインドされました。

たとえば、2 つのユーザー コントロールで構成される検索ページがあります。1 つ目は、相互に依存する複数のコンボ ボックスと検索ボタンを含む検索パラメーター コントロールです。2 つ目は、結果グリッド自体です。これら 2 つのコントロールを含むページのビュー モデルは、それらの間の通信を処理します。問題は、この検索コントロールが他のページでも使用され、それらすべてが同じビュー モデル インスタンスを使用すると、あらゆる種類の頭痛の種になることです。したがって、通常の「DataContext={Binding ProductSearch, Source={StaticResource Locator}}」を使用することは問題外のようです...

他の誰かがこれに遭遇したか、それを解決するための素晴らしいアイデアを持っていますか? コントロールが使用されているページごとに、ロケーターを変更してビュー モデルの新しいインスタンスを作成できるのではないかと考えています。そうしないと、ページ遷移ごとにクリーンアップを強制することはできますが、ページ間の状態を保存することはできません。

私は Silverlight と MVVM の世界全体に慣れていないので、これがどのように構成されるべきかについて何かが欠けているか、自分自身を隅に追いやったのかもしれません。よくわかりません。どんな提案でも大歓迎です。

4

1 に答える 1

2

あなたの主な問題は、Silverlight ナビゲーション フレームワークに移動すると、ビューの新しいインスタンスが常に作成されるという事実です。INavigationContentLoader を使用してこの動作をオーバーライドし、ビューのインスタンスを保存して再利用することができます。

INavigationContentLoader の使用例としては、David Poll の「Silverlight 4 ナビゲーションを開く: INavigationContentLoader の紹介」や、Mike Taultry の「Silverlight 4 ラフ ノート: ナビゲーションの制御」のブログ投稿があります。これらの投稿は、独自のコンテンツ ローダーを作成する方法のみを示しています。それを使用して既存のビューをリロードするのはあなた次第です。

于 2010-06-23T17:12:40.177 に答える