2011-07-12 6 views
1

私はあなたが1つのオブジェクトを持ち、そのオブジェクトのプロパティを変更できるメインビューを持っています。しかし、ボタンをクリックするとポップアップウィンドウが表示されます。これは高度なプロパティです。しかし、ポップアップウィンドウで行うこれらの変更は、メインビューのオブジェクトでも行わなければなりません。オブジェクトを2つのビューモデルに渡すにはどうすればいいですか? Wpf MVVM

私はポップアップのためにビューモデルを実装しました。私はここにいくつかのコードを置くことができますが、私は何も持っていないので、これはまったく役に立たず、そのオブジェクトのプロパティを変更するためにいくつかのテキストボックスをバインドした2つのビューモデルだけです。したがって、2つのビューモデルは同じオブジェクトでは機能しません(これは私が思うはずです)。

メインビューで作業しているオブジェクトにポップアップを表示するのは難しいです。いくつかの方法で、私はポップアップで行った変更をメインビュー(同じオブジェクト)に渡すことができる必要があります。これを行う方法を知っている誰か?私はこれを長い間探していますが、私は実際に問題を解決するか、または回避するのか分かりません:(..

答えて

0

アーキテクチャによっては、これを達成する方法がいくつかあります。たとえば、リッチドメインモデルを使用している場合、ビューモデルに公開されているModelプロパティに直接バインドすることができます。この場合、拡張プロパティウィンドウを呼び出すと、既存のモデルのインスタンスをそのビューモデルに渡すことができます。拡張プロパティウィンドウの変更は、元のウィンドウで開いたビジネスオブジェクトの同じインスタンスにバインドされます。

また、モデルを直接ビューに公開しない貧血ドメインモデルを使用している場合でも、モデルの同じインスタンスを新しいウィンドウに渡すことはできますが、メディエータパターン(または他の標準的なインタービューモデル通信技術)を使用して、アドバンストウィンドウが閉じるときに元のウィンドウに通知する。この場合、高度なウィンドウはパブリッシャーになり、元のウィンドウはサブスクライバーになります。

通知されると、元のウィンドウはビューモデルバインディングをすべて無効にして、UIが適切に更新されるようにします。

+0

私は最初に私は思っていますが、はい、私はこれを高度なウィンドウのビューに与えることができます。しかし、私の問題は今、私はこのポップアップを閉じてメイン画面に戻るときに何をしなければならないのですか?それから、私は新しく変更されたオブジェクトをメインのビューモデルに戻さなければなりませんか?または今私は間違っていますか? – Ruben

+0

前述のとおり、2番目のビューモデルはモデルの同じインスタンスを更新するため、元のビューで元のコピーを更新する必要はありません。高度なウィンドウが閉じたときに通知する必要がある場合は、標準.NETイベントを使用して通知を受けるか(元のウィンドウで登録するか、詳細ウィンドウで公開するか)、またはイベントアグリゲーターを使用できます。どのMVVMフレームワークを使用していますか。 – devdigital

+0

ありがとうございます!私はそれを最終的に取得し、それは正常に動作します。 – Ruben

0

すべての必要なプロパティを含むViewModelを1つ持つことができます詳細ビューで編集しています)。次に、同じViewModelをポップアップビューに渡すだけで、ViewModelオブジェクトインスタンスは同じですが、2つのビューはちょっと違っていて異なるプロパティの編集が可能です。

+0

私は、私はちょうど1つの余分なビューモデルを作ると思いますか?それから私はこのビューのコンストラクタでポップアップにこれを渡しますか?しかし、私はこのポップアップを閉じると、再び基本的なプロパティを編集する必要があります..私はどのようにこれを行うのですか?最初のviewmodelにviewmodelを再び渡すには? – Ruben

0

ビューモデル間でこの「ソース」を共有する方法を見つける

たとえば、ある種のORMを使用している場合あなたが共同uldは(静的な)ドメインサービスを実装しています。これはあなたのビューモデルがオブジェクトを要求します。

例:DomainServiceが「GetPersonById(int id)」メソッドを公開し、同じオブジェクトを両方のViewModelに返す可能性があります。

+0

いいえオブジェクトのプロパティを埋める何かを実装していて、アプリケーションはこのオブジェクトをXMLファイルに書き出します。 – Ruben

0

または、両方のViewModelに渡され、それぞれがそのViewに必要なものを公開する1つのBusinessObjectを持つことができます。そうすれば、1つのビジネスオブジェクトが2つのVM全体で共有されます

関連する問題