1

2 つの親ビュー間で共有される子ビュー (SharedView) があるので、このようなリージョンを介して各親ビューに追加します

<StackPanel>
  <ContentControl cal:RegionManager.RegionName="SharedViewRegion" />
</StackPanel>

親ビューのViewModelで、子ビューを次のように登録します

regionManager.RegisterViewWithRegion("SharedViewRegion", typeof(SharedView));

親ビューの 1 つだけを開いてアプリケーションを実行すると、期待どおりに動作しますが、2 つの親ビューを開くと、次の例外が発生します。

「SecondRegion」という名前の領域を作成中に例外が発生しました。例外は次のとおりです: System.InvalidOperationException: 指定された要素は、既に別の要素の論理的な子です。最初に切断します。

私はグーグルで調べてきましたが、これが私の問題に近い解決策ですInvalidOperationException は、同じビューインスタンスが複数の ContentControl 領域に追加されると発生します

しかし、私はプリズム ナビゲーション機能を使用しているので、このように親ビューをインスタンス化しています

regionManager.RequestNavigate("ModuleRegion", new Uri("ParentView1", UriKind.Relative));

誰かがこれを解決するのを手伝ってくれますか?

4

2 に答える 2

1

次のことを試してください。

リージョンをホストしているContentControlに名前を追加します

ここで、親ビューを離れる前にリージョンのコンテンツを削除する必要があるため、ViewModelで次のコードをOnNavigatedFromメソッドに追加します

public void OnNavigatedFrom(NavigationContext navigationContext)
{
  ParentView.MyContentControl.Content = null;
}

注:ViewModelにインポートする親ビューにアクセスできます。

リージョンを離れる前にコンテンツを削除したため、コンテンツを手動でリージョンに追加する必要があります。これがコードです

public void OnNavigatedTo(NavigationContext navigationContext)
{
  SharedView view = (SharedView)ServiceLocator.Current.GetInstance(typeof(SharedView));
  ParentView.MyContentControl.Content = view;
}

注:このメソッドでは、PRISMがSharedViewをMyContentControlに追加しようとするため、このビューを初めて開いたときにSystem.InvalidOperationExceptionが発生するため、回避策を追加する必要があります。

考えられる回避策は次のとおりです

bool isFirstTime = true;

public void OnNavigatedTo(NavigationContext navigationContext)
{
  if (isFirstTime)
  {
    isFirstTime = false;
    return;
  }
  SharedView view = (SharedView)ServiceLocator.Current.GetInstance(typeof(SharedView));
  ParentView.MyContentControl.Content = view;
}

SharedViewを共有するすべての親ビューで同じ作業を行う必要があります

これがお役に立てば幸いです

于 2012-08-03T15:33:39.883 に答える
0

この場合、ビューの検出ではなく、ビューをリージョンに直接追加する必要があります。親ビューに一意の名前を付けます (カウンターを使用して一意の名前を作成できます)。

var region = this.regionManager.Regions["SharedViewRegion"];
var viewName = string.Format("SharedView{0}", this.countParent+1);

//Only add if it doesn't exist
var view = region.GetView(viewName);
if (null==view)
{
 //Use container to get new instance of the parent view.
 view = this.container.Resolve<SharedView>();
 region.Add(view, name);
 //Increment the counter as you added a new parent view 
 this.countParent++;
}

//Now activate the view
region.Activate(view);
于 2012-08-03T13:35:14.513 に答える