2011-08-13 12 views
5

私は大規模なMVVMアプリケーションで作業しています。私はこれにMVVMのライトツールキットを使用しています。アプリケーションは、前後のボタンを備えたWebブラウザのようなものです。メインビューはユーザーコントロールです。メインビューのユーザーコントロールに戻るボタンと進むボタンを配置しました。メインビューには、ユーザーコントロールがあります。ユーザーコントロールは、前後のボタンをクリックすると変更されます。メインのViewModelは現在のユーザーコントロールを追跡し、ボタンのクリックに応じて次のコントロールを読み込みます。MVVM:通信

これらすべてのユーザーコントロールは、最初の手順で選択したIDに応じてロードされます。メインビューは検索画面で、顧客を選択します。次の画面は、アドレス、請求、要求などです。これらの画面はデータを共有しません。しかし、そのデータは同じ顧客のものです。

メインビューに顧客IDを保存することをお勧めしますか?これを行うと、コマンドにバインドされたUserControl_Loadedイベントが必要になります。そこで、アドレスと請求情報を要求します。

または、メインビューではなく各ユーザーコントロールにボタンを移動できます。次のビューを読み込むメッセージで顧客IDを渡します。

どちらが優れていますか?

+0

物事を切り離すには、コマンドを使用するのではなく、MVVM Light 'Messenger'を使用して' CustomerSelected'メッセージ(Idを含むことができる)を公開することを検討してください。あなたの他のコントロールは、このメッセージを購読することができます。 –

+0

これについての私の考えは、ソースと現在のビューに応じて、戻るボタンと進むボタンがメインビューにある場合、ビューモデルにメッセージを送信する必要があります。私はそれを避けたい(現在のビューに応じてメインビューからメッセージを送信する)。だから、私はUser_Control Loadedイベントを考えていました。 – katie77

+0

なぜメッセージを送信したくないのですか? –

答えて

4

私が過去にこのようなことを行った方法は、操作のデータコンテキストをカプセル化するクラスを実装することです。すべてのページには、このクラスのプロパティが設定されます(および更新されます)。メインビューモデルは、このクラスのインスタンスとページビューモデルのコレクションを作成し、それぞれにデータコンテキストを提供します。また、ページ間の移動を処理し、CurrentPage,NavigateForwardCommand、およびNavigateBackwardCommandのプロパティを実装します。

ユーザーがページ1に戻って顧客IDを変更した場合、データコンテキストには新しい顧客に適した情報が再入力されます。すべてのページが同じデータコンテキストオブジェクトを参照しているため、後続のすべてのページに正しい情報が表示されます。

データコンテキストオブジェクトにプロパティ変更通知を実装し、ページ内でPropertyChangedを処理する必要があります。データコンテキストオブジェクト内のCustomerIDプロパティが変更されると、ページビューモデルはそれぞれのビューに表示されるプロパティを更新する必要があります。

+0

偉大な答え。ちょっとしたビットを追加するだけです....各ビューとメインビューは、実行している操作の種類を表すデータコンテキストを持つ必要があります。メインビューで顧客選択が行われている場合、そのデータコンテキストにはSelectedCustomerIdプロパティが必要です。しかし、最終的には、メインビューは子どもにこれらの変化を何らかの形で見せなければならず、一方で、それぞれの子ビューにメインビューのデータコンテキストへの参照を渡し、現在の顧客IDを判断できるようにする必要があります。 –

+0

こんにちは、私はここで混乱しています。申し訳ありませんが、私は基本的な質問をしています。しかし、MVVMのライトにはViewモデルロケータがあります。そのクラスにビューモデルのインスタンスを作成します。私はすべてのビューモデルを持つクラスを作成しようとし、ビューモデルをインスタンス化しようとしました。しかし、それはうまくいきませんでした – katie77

+0

私はあなたがこのオブジェクトをインスタンス化しようとするときに実際に何が起こっているのかを調査し、具体的に何が期待どおりに動作していないのかを説明する必要があると思います。 –

関連する問題