2011-01-12 5 views
3

私は自分のMVVMを持っていて、モデルはいくつかの関連するクラスで構成されていますが、この質問のためには4つだけに焦点を当てます。WPF用DependencyPropertyアナログMVVMモデル

GrandParentModel、ParentModel、ChildModelおよびContact。

これらはすべて、ModelBaseから継承されています。このモデルには、INotifyPropertyChangedの実装があります。

したがって、3つのモデルのそれぞれにContactプロパティがあります。 Childがプロパティを持たない場合はParentを探し、Parentが空白の場合はGrandParentを探します。連絡先が祖父母レベルで変更された場合、私は扶養家族、つまり親子とその子どもが連絡先のPropertyChangedイベントを提起したいと思います。

私はDependencyPropertyシステムによってサポートされると思いますが、これは私のモデルであり、懸念事項とそのすべてであるため、使用したくありません。だから私は一緒にミニの実装を入れている、これはすべて上質です。

私の質問は、誰もがこの道を前にしていたことであり、将来私が心配すべきことは何ですか?私のSpidey-Sensesはうずきがあり、私は理由を知らない。

おかげ イアン

編集:ここでは、オブジェクト間の関係は、祖父母が両親のいずれかの数は子供の任意の番号を持っているということです。私の現在のモデルは、親(祖父母の場合はnull)をポイントするプロパティと、親/祖父母が子オブジェクトのコレクションを持つプロパティを持っています。

+0

クラス階層/リレーションシップの例を追加してください。 (できれば擬似コードで)彼らは "a"か "have a"の関係にありますか?複雑なプロパティやコレクション? –

+0

この場合、私のModelBaseには作成時にオブジェクトの親に設定されている親プロパティが含まれています。コード長をここに収まるものにすることができれば完全な解決策を投稿します。私は少し上記の編集を追加しました、構造は正直に石で修正されていません。 – Ian

答えて

2

私はこの道を辿ってきました。基本的にはChildModelからPropertyChangedのイベントをParentModelに登録する必要があります。あなたの子供が両親を変えることができるかどうか注意を払わなければなりません。次に、子供の視点から親の変化を通知されると、子供のために自分のPropertyChangedイベントを起こさなければなりません。あなたがきれいにするのを忘れたイベントハンドラをぶら下げてしまうことがあるので、醜いです。

より良い方法は、モデル固有のアナログをDependencyPropertyに作成することです。基本的にChildModelのコンストラクタでは、nullの場合、そのプロパティのContact代理人がオブジェクトContactのオブジェクトParentの代理人を宣言します。これは、ParentModelオブジェクトのPropertyChangedイベントを監視し、適切な場合には子に対してPropertyChangedイベントを実行する小さなヘルパークラスを使用して行います。また、子供のためにParentプロパティが変更されるのを見てください。

MVVMライトメッセージバスを使用できます。 Contactプロパティが変更された場合、祖父母と親はすべてメッセージを送信します。子供にそれらのメッセージを聞かせる。メッセージを受け取ったら、それが自分の親または祖父母と一致するかどうかを確認し、必要に応じてPropertyChangedイベントを発生させます。これは、親または祖父母がいつ変化するかを把握する必要がないため、上記のいずれの方法よりも優れています。あなたはバグを起こす可能性は低いです。また、弱い参照も使用するため、イベントハンドラのやり方をオブジェクトに保持しません。

今私が行ってきたことは、私のモデルオブジェクトにINotifyPropertyChangedを実装させることから離れていることです。私はモデルと私のViewModelの間にPresenterレイヤーを導入しました。 Presenterは、実際には小さなViewModel「ウィジェット」からViewModelを構築します(たとえば、1つのウィジェットはChangeValue<T>ウィジェットです)。私はPresenterに、与えられたモデルのウィジェットからViewModelを構成する方法を伝えるルールエンジンを持っています。 Presenterは、すべてのユーザー入力(基本的にモデルに対してラムダを実行します)を処理しますが、ユーザーアクションが行われたことを知っているため、モデル内の何かが変更された可能性があります。 Modelアクションが完了すると、ModelからViewModelにすべてのデータがコピーされます。 ViewModelは受信データを検査し、フィールドが実際に変更された場合はPropertyChangedイベントを発生させます。明らかにそれはそれを行う最も合理的な方法ですが、それはあなたに本当にきれいなモデルを提供し、ViewModelもPresenterもモデル(ドメイン/ビジネス)ロジックを含んでいません。

+0

興味深い。私はクラスのようなDependencyプロパティをまとめました。私はコードの前に戻ったときに、明日のバージョンを切り捨てて投稿します。私はあなたのプレゼンターのコンセプトが好きです。私は少し似たようなことをやっています。だから、あなたが言っていることを聞いていいですね。それは私の考えを助けるでしょう:) – Ian

+0

Okie dokie解決策があります。ここに投稿するには長すぎるでしょう。私はブログ投稿をまとめて、許可されている場合はそのURLを投稿します。 – Ian

+0

@イアン - 私はそれを実際に見たいと思います。投稿してください。 –