2011-01-26 19 views
1

私はMVVMパターンに基づいてWPFアプリケーションを持っています。それは左側に木があり、右側に細部があります。ツリーにはさまざまなタイプのオブジェクトが含まれており、それぞれのタイプのビューモデルがあります。ビューでは、各ビューモデルタイプに対して異なるデータテンプレート(ユーザーコントロールを含む)があります。現在の詳細ビューに基づくデータバインディングを介してビューが選択されます。WPF MVVM:ViewModelが変更されたときにビューが再ロードされない

ツリーノードを切り替えると、ノードごとに新しい詳細ビューモデルがインスタンス化され、ビューもそれに応じて変更され、DataContextChangedイベントとLoadedイベントの両方が発生します。つまり、私は同じタイプのオブジェクトを切り替えるまでです。ここでも、詳細ビューモデルは更新されますが、ビューインスタンスは同じままです。つまり、DataContextChangedイベントのみが起動されますが、Loadedイベントは起動されません。

Loadedイベントを強制的に発生させる方法はありますか?たとえば、ビューを再初期化するなどですか?

Loadedイベントが必要なのは、データバインディング時にWPFが入力コントロールの選択変更イベントを発生させ、ユーザーがトリガされた選択変更イベントに作用するロジックがあるため、トリガーされたイベントを無視できるようにする必要があるためですデータバインディングによって。今のところ、Loadedイベントはこれを行うための最善の選択肢のようです。記載されている問題がある。

おかげで、それはデータコンテキストが変更するたびに実行する必要がある場合は、DataContextChangedハンドラにロードハンドラを持っているものは何でもロジックマイケル

+1

SelectionChangedイベントが必要な場合は、私には良くないデザインのように聞こえるので、選択したアイテムに直接詳細ビューをバインドすることができます。特に、選択の変更をバインドするために異なる動作が必要であるという事実は、むしろ怪しいです。それだけでなく、問題の簡略化されたコードを投稿するのが役に立ちます。 –

+0

上記の問題を再現するコードを投稿してください。 –

+0

答えをありがとう。サンプルアプリケーションがこれをよりよく強調表示するようになりました。残念ながら(私のために)私は一緒に1つを置くことができる日の数日前になります。ああ、サンプルを含むファイルをどのように添付できますか? – Michael

答えて

0

移動します。

+0

申し訳ありませんが、私はすでにそれを試みました。ビューのタイプが変更されていない場合、Loadedイベント*は起動しません。 – Michael

+0

明確にする:ビューの読み込みイベントは、ビューが読み込まれると呼び出されます(呼び出すと変更されます)。データコンテキストが変更されると、Loadedイベントは発生しません。データコンテキストが変更されると、DataContextChangedイベントが発生します。データコンテキストが変わってしまった時には、そのロジックをDataContextChangedのイベントハンドラに入れてください。 –

+0

私はそれを理解しています。問題は、インスタンスが異なるタイプでなければビューモデルインスタンスが変更されたときにビューを再ロードする必要がないことをWPF自身が判断し、異なるビューを必要とすることです。これはWPFで設計されている可能性が非常に高いです。それにもかかわらず、データコンテキストの変更のために発生する選択変更イベントの後に発生する可能性のあるフックのリストからLoadedイベントを削除します。 – Michael

関連する問題