0

メイン コンテンツ エリア (つまり、ドキュメントが真の MDI インターフェイスではなく、TabControl に表示される場所) があり、サイドにメニューがあるという点で、Visual Studio に似たアプリケーションを作成しようとしています。

これまでのところ、コンテンツを除いてすべてが機能しています。私の目標は、ユーザーがサイドのナビゲーション メニューの項目をダブルクリックすると、ドキュメントがコンテンツ領域で開かれるようにすることです。これは機能しますが、ダブルクリックするたびに、同じビューの新しいインスタンスが生成されます。TabControl コンテンツ コンテナー内に、同じタイプ (ただし「名前」が異なる) のビューが複数ある可能性があります。

現在、私のコードは次のようになっています...

            IRegion contentRegion = IRegionManager.Regions[RegionNames.ContentRegion];

            object view = IUnityContainer.Resolve(viewModel.ViewType, viewModel.UniqueName);

            if (!IUnityContainer.IsRegistered(viewModel.ViewType, viewModel.UniqueName))
            {
                IUnityContainer.RegisterInstance(viewModel.UniqueName, view);
                contentRegion.Add(view);
            }

            contentRegion.Activate(view);

ただし、ビューを登録しても、ビューが登録されていないようです...おそらくこれを間違っていると思います-これを行う別の方法はありますか? (re: 正しい方法)

4

1 に答える 1

0

だから、問題はこの方法でそれをやろうとしていた. スマートな方法 (これを行おうとしている他の人にとって) は、Prism を正しい方法で利用することです。

私がやったことは、代わりに次のようにナビゲートすることでした:

1 . ナビゲーション メニューで、表示したいビューの UniqueID (一意であることが保証されています) を使用して UriQuery (Prism に含まれています) を作成し、それを移動先のビューに追加します。

    IRegionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(ViewNames.MyViewName + query.ToString(), UriKind.Relative));

query は UriQuery オブジェクトです。

2 . 次の方法でモジュールに View と ViewName を登録します。

        IUnityContainer container = ServiceLocator.Current.GetInstance<IUnityContainer>();
        container.RegisterType<object, MyView>(Infrastructure.ViewNames.MyViewName);

3 . ビューで、ViewModel がコンストラクターのパラメーターであることを確認します。Prism にこれを手動で注入させます。コンストラクター内で、DataContext を受信ビューモデルに設定していることを確認してください。

4 . 最後に、ViewModel が INavigationAware インターフェイスを実装していることを確認してください... これは非常に単純な実装です (UniqueID は ViewModel のプロパティです)。

    public virtual bool IsNavigationTarget(NavigationContext navigationContext)
    {
        if (navigationContext.Parameters != null)
            return (navigationContext.Parameters["UniqueID"] == UniqueID);

        return false;
    }

    public virtual void OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    public virtual void OnNavigatedTo(NavigationContext navigationContext)
    {
        if (navigationContext.Parameters != null)
            UniqueID = navigationContext.Parameters["UniqueID"];
    }

ここから、Prism は、「UniqueID」のビューが 1 つだけ存在することを保証しますが、同じビューの別の ViewModel (またはその ViewModel のデータ、つまり異なるタブで 2 人のユーザーを表示しますが、両方とも同じものを使用します) を許可します。テンプレート化されたビュー)。

于 2012-05-15T18:18:46.333 に答える