コンポジットビュー - ビューがすでにリージョンエラーに存在する

私はWPF/Prism 4/AvalonDocアプリケーションに取り組んでいます。

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

リージョンをビューに配置し、「マスター」ViewModelコンストラクタのregionManager.RegisterViewWithRegionメソッドを使用して、そのリージョンにサブビューをロードしました。

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

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

2

2 答え

MEFを使用していて、ビューがSingletonの場合

[PartCreationPolicy(CreationPolicy.Shared)]

あなたの INavigationAware がfalseを返します

public override bool IsNavigationTarget(NavigationContext navigationContext)

{return false;}

このエラーが発生します。

Change [PartCreationPolicy(CreationPolicy.Shared)] to [PartCreationPolicy(CreationPolicy.NonShared)]

あなたは終わりました。

1
追加された

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

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

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

0
追加された