2016-05-24 13 views
0

私はまだ私はMVVMLightを使用しています、MVVMパターンを学んでいる、と私は、この問題に来た:MVVMのUserControlアクティブ非アクティブ状態

私は2つの異なるのviewmodels AとBを持っている、のは言ってみましょう、彼らはのページです私のアプリケーションであり、彼らは常に生きています。また、メッセンジャーを通じてメッセージを送信するサービスもあります。

AとBの両方が、これらのメッセンジャー通知に登録されています。 この時点では、ウィンドウには1つのビューモデル(このシナリオではページ)しか表示されません。メインウィンドウに2つのボタンを配置します。それぞれのビューモデルAまたはBに1つずつ配置されているため、いつでもビューモデルAまたはビューモデルBに移動できます。彼らは処分せず、単に「隠す」。

(私はRachel Lim's postようCurrentViewModelのアプローチを使用しています。私はそれが簡単で、有用であることが分かっているので、私はそれを使用しています。あなたがより良いアプローチを知っていれば、私は喜んでそれを聞くのが好きです。)

を今、唯一の1としてviewmodelは 'アクティブ'ですが、私は他の人がそれらのメッセージを受信しないようにします。 現在のページがビューモデルAの場合、ビューモデルBがメッセージを受信しないようにします。どのように私はviewmodelのは「非アクティブ」状態になると知ることができ、

  • 私は思ったが、しかし、メッセンジャーの通知から「非アクティブ」のviewmodelを解除する:

    これは私が試した何ですか?

  • また、ビューモデル「IsActive」などのプロパティを作成し、シェルビューモデルのCurrentViewModelが変更されたときに、すべてのビューモデル「IsActive」プロパティをfalseに設定して反復処理を行います。 'アクティブな'ビューモデル。しかし、私のビューモデルがリストにない場合はどうなりますか?私は大胆になったと思うので、clunkyと不適切な、より良い方法がある必要があります。

  • は、それから私は、サシャ理容室からCinch Seriesを思い出して、私の注意View Lifetime Behaviorsに来て、私はと私のページである(ユーザーコントロールでは、howevever、ロード、アンロード、アクティブ化および非アクティブ化イベントを知るために、そのアプローチを気に入ってDataTemplate)、ActivatedおよびDeactivatedは使用できません。

    だから、

1)それはCurrentViewModelでのviewmodelを通知するためのベストプラクティスは何ですか?

2)ナビゲーションパターン(レイチェルのような、またはあなたが良いものがわかっている場合は、調査するように教えてください)で非CurrentViewModelへのメッセンジャー通知を無効にします。

お時間をいただきありがとうございます。

答えて

0

現在の表示と現在のビュー/ビューモデルのウィンドウで追跡しているメッセージをウィンドウに戻すのはどうでしょうか?

+0

こんにちは。はい、シェルウィンドウ内のCurrentViewModelを追跡することは、Rachelの例がどのように動作するかです。ただし、メッセンジャー通知はシェルウィンドウで受信されず、代わりに両方のビューモデルで受信されます。ビューモデルがシェル内の現在のものでない場合、通知を受け取らなくてはなりません。だから、IsActive == Falseの場合、プロパティ 'IsActive'を追加しようとしましたが、通知は無視されます。御時間ありがとうございます。 – BlackCath

0

つの思考の両方使用してカスタムメッセージクラス:

1)は、メッセージの送信者がアクティブになっているのviewmodelを知っていますか?メッセージペイロードの一部には、それを処理するビューモデルが含まれる可能性があります。メッセージを受信すると、各ビューモデルはペイロードをチェックして、メッセージを処理すると考えられるかどうかを見ることができます。しかし、非アクティブなビューモデルは依然としてメッセージを受信するため、非効率的です。

2) "ActiveMessage"カスタムメッセージクラスを作成して、ビューモデルがアクティブで、シェルから送信されるペイロードを作成することができます。各ビューモデルはこのメッセージクラスに登録されたままです。それぞれの "ActiveMessage"がviewmodel用であれば、 "RegisterForMessages"メソッドを呼び出します。このメソッドは必要な他のすべてのメッセージタイプのviewmodelを登録します。後で、別のビューモデルを持つ "ActiveMessage"メッセージを受け取ると、 "UnregisterForMessages()"メソッドが呼び出されます。このメソッドは、メッセージが "非アクティブ"のときに登録を解除します。

+0

こんにちは。あなたの最初のアイデアは私の前に来て、それを考えた後、私は非アクティブなビューモデルが常にメッセージを受け取ることに気づきました。だからこそ、私は運がない別の角度を求めていたのです。私がまだ学んでいるように、私はあなたの第2のアイデアをすべて理解することができません、私はそれを考えていきます。多分将来的には役に立つかもしれない。御時間ありがとうございます。 – BlackCath

関連する問題