2010-12-13 22 views
2

私はシェルで2つのセクションを宣言したプロジェクトで作業しています。これらのうちの1つは、アイテムがオンデマンドでモジュールをロードし、別のモジュールが要求されたモジュールのビューをロードするために使用されるメニューを配置するために使用されます。あなたは「メニュー」のボタンシリーズ(これが唯一のテスト用です)、私は必要な地域のように動作しますContentControlにして構成されて見ることができるようにPrism v4/MVVM(Unity/WPF) - モジュールを同じ地域にロードする

これは、シェルの設計

<StackPanel Orientation="Vertical" Grid.Column="0" Grid.Row="1"> 
     <Button Content="Home" Height="23" Name="Home" Width="75"/> 
     <Button Content="Users" Height="23" Name="Users" Width="75"/> 
    </StackPanel> 
    <Border Grid.Column="1" Grid.Row="1" Background="WhiteSmoke"> 
     <ContentControl cal:RegionManager.RegionName="MainRegion" Name="MainRegion"/> 
    </Border> 

の一例ですViewsをロードする。

これは私のBootstraperにモジュールを追加する方法の例です:

protected override void ConfigureModuleCatalog() 
    { 
     base.ConfigureModuleCatalog(); 

     System.Type homeModule = typeof(FieldCollection.Home.HomeModule); 
     ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; 
     moduleCatalog.AddModule(new ModuleInfo() { ModuleName = homeModule.Name, ModuleType = homeModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); 

     System.Type userModule = typeof(FieldCollection.User.UserModule); 
     moduleCatalog.AddModule(new ModuleInfo() { ModuleName = userModule.Name, ModuleType = userModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); 

    } 

これは、モジュールの初期化方法である:

public void Initialize() 
    { 
     this.container.RegisterType<IUserController, UserController>(new ContainerControlledLifetimeManager()); 
     this.regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.UserSummaryView)); 

    } 

そしてfinalllyこれは、モジュールが呼び出された方法ですメニューから選択します。

private void User_Click(object sender, RoutedEventArgs e) 
    { 
     moduleManager.LoadModule("UserModule"); 
    } 

問題は、呼び出された最初のビューだけが領域内に表示されることです。私はあなたの助けのための

おかげ

答えて

2

ContentControlだけあなたが複数のアイテムが同じ領域内に表示したい場合はItemsControlを使用し、一つの項目を含めることができます依存性注入コンテナのようにプリズム4とユニティを使用しています。

LoadModule(String)は、モジュールのIModule.Initialize()メソッドを1回呼び出して、その時点でアクティブにします。モジュールのロードとモジュールの表示は同じではありません。したがって、LoadModule(String)を再度呼び出すと、ビューはアクティブになりません。モジュールとビューは1:1の関係ではありません。モジュールには複数のビューが関連付けられています。あなたの代わりに何ができるか

Tを表示するビューのインスタンスであるコール

IRegionManager.Regions["MainRegion"].Activate(T); 

...です。

+0

私がItemsControlを使用すると、すべてのモジュールが同じ領域に表示されますが、一度に表示できるモジュールは1つだけです。 あなたの答えをありがとう – mascab

+0

@mascabそれでは、ContentControlを保存して、上記の詳細をチェックしてください... –

関連する問題