2011-10-27 6 views
2

私はWPF/Prism 4/AvalonDocアプリケーションを開発中です。コンポジットビュー - リージョンエラーに既に存在するビュー

私の意見の一つは非常に複雑で、ViewModelは巨大で管理不能になっています。だから、私は自分のViewModelsを使って小さなビューに分割することにしました。

"master" ViewModelコンストラクタのregionManager.RegisterViewWithRegionメソッドを使用して、ビューに領域を配置し、その領域にサブビューをロードしました。

これは、ビューのインスタンスが1つしかロードされていない場合と同様に動作します。しかし、私はその画面の2番目のインスタンスを開いているとき(DocumentContentとしてAvalonDockのDocumentPaneに読み込まれています)、 "View already exists in region"というエラーが表示されています。

可能であれば、地域に固有の名前を付けないようにしたいと思います。 「マスター」ビューの特定のインスタンスにサブビューを追加していることを示す方法はありますか? これを行う方法に関するアドバイスはありますか?

答えて

0

同じ名前の複数の地域を持つことはできません。ビューモデルが複雑になると、ビューを分割したくないと思います。ビューモデルを複数の特殊なビューモデルに分割できます。

例。あなたはユーザー管理を持っています。 1つのビューモデルはすべてのユーザーのリストです。このリストにはユーザービューモデルが含まれています。また、各ユーザービューモデルには、ユーザー権利ビューモデルのインスタンスが含まれています。このモデル自体も、1つのユーザー権利のみを表すビューモデルのリストです。したがって、特別なユーザー権限を提示する方法に関するロジックは、「マスター」ユーザーリストビューモデルではなく、対応するビューモデルに入ります。このようにして、懸念を別のビューモデルに分けることができます。

これらのビューモデルにバインドすることは、ビューモデルを1つだけ持つことと同じくらい簡単です。ちょうどその道のりがもう少し長くなっています。データコンテキストが上記の例のユーザーリストビューモデルである場合、CurrentUserVM.UserRightsVMのようなバインディングパスを使用して、ユーザー権利のリストを得ることができます。

1

あなたはMEFを使用していて、あなたのビューがシングルトンすなわち

[PartCreationPolicy(CreationPolicy.Shared)] 

とあなたINavigationAware

public override bool IsNavigationTarget(NavigationContext navigationContext) 

にfalseを返す場合には{falseを返す;}

をあなたはこのエラーを取得します。

変更[PartCreationPolicy(CreationPolicy.Shared)]

[PartCreationPolicy(CreationPolicy.NonShared)]に、あなたが行われています。

関連する問題