2

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

私のビューの 1 つが非常に複雑で、ViewModel が巨大で扱いにくくなっています。そこで、独自の ViewModel を持つ小さなビューに分割することにしました。

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

ビューのインスタンスが 1 つだけ読み込まれている場合、これは期待どおりに機能します。しかし、その画面の 2 番目のインスタンス (DocumentContent として AvalonDock の DocumentPane にロードされる) を開くと、「View already exists in region」というエラーが表示されます。

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

4

2 に答える 2

1

MEF を使用していて、ビューがシングルトンの場合

[PartCreationPolicy(CreationPolicy.Shared)]

そしてあなたのINavigationAwareリターンは偽です

public override bool IsNavigationTarget(NavigationContext navigationContext)

{偽を返す;}

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

[PartCreationPolicy(CreationPolicy.Shared)]に変更[PartCreationPolicy(CreationPolicy.NonShared)]

これで完了です。

于 2013-03-22T14:26:51.667 に答える
0

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

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

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

于 2011-10-28T07:47:08.840 に答える