【お勉強記録】Prism6.0の自習(Bootstrapper ViewModelLocater Model Regionまで)
Prism
連休中ということで、Prism6.0を勉強してみました。
かずきさんのPrism自習用リポジトリをもとに勉強しています。
GitHub - runceel/PrismEdu: PrismLibrary japanese text.
Bootstrapper
PrismではShellという基本となる画面があってBootStrapperというUnityBootstrapperを継承したクラスで起動を管理するようです。
using HelloWorldApp.Views; using Microsoft.Practices.Unity; using Prism.Unity; using System.Windows; namespace HelloWorldApp { class Bootstrapper:UnityBootstrapper { protected override DependencyObject CreateShell() { return this.Container.Resolve<Shell>(); } protected override void InitializeShell() { ((Window)this.Shell).Show(); } } }
ViewModelLocater
ViewModelLocaterはViewとViewModelとの紐づけのための機能です。 View(Xaml)のWindowやUserControlに
xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True"
と書くことで、命名のルールに基づいてViewのDataContextにViewModelが割り当てられます。(View:Views.Hoge ViewModel:ViewModels.HogeViewModel といった感じ)
ModuleとRegion
Moduleでアプリケーションの機能ごとに分割して開発することが可能。 Regionは作成されたModuleをShellの特定の領域(Region)に流し込むための機能のようです。Regionのおかげで複数のModuleを柔軟に組み合わせて作ることができるようです。
Moduleで作成する画面部品は「Window」ではなく、「UserControl」ですね。当たり前ですが、ここで少しハマりました。WindowだとShell上でRegionをしっかり定義していても、反映されませんでした。 あとは普通の画面の作成と同じようにModel、View、ViewModelと作っていきます。 それができたら、IModuleインターフェースを実装したクラスを作成します。
using Microsoft.Practices.Unity; using ModuleApp.HelloWorldModule.Models; using ModuleApp.HelloWorldModule.Views; using Prism.Modularity; using Prism.Regions; namespace ModuleApp.HelloWorldModule { public class HelloWorldModule:IModule { [Dependency] public IUnityContainer Container { get; set; } [Dependency] public IRegionManager RegionManager { get; set; } public void Initialize() { this.Container.RegisterType<MessageProvider>(new ContainerControlledLifetimeManager()); this.Container.RegisterType<object, HelloWorldView>(nameof(HelloWorldView)); this.RegionManager.RequestNavigate("MainRegion", nameof(HelloWorldView)); } } }
Containerにクラスを登録するのと、Shellで定義したRegionに画面部品を流し込むためRegionManager.RequestNavigateを実装しました。
本体側では、ModuleをBootstrapperで組み込み、ShellでRegionを定義します。 BootstrapperクラスのConfigureModuleCatalogメソッドをオーバーライドしてModuleを追加するそうです。
protected override void ConfigureModuleCatalog() { base.ConfigureModuleCatalog(); var catalog = (ModuleCatalog)this.ModuleCatalog; catalog.AddModule(typeof(HelloWorldModule.HelloWorldModule)); }
ShellでのRegionの定義方法は以下の通りです。
<ContentControl prism:RegionManager.RegionName="MainRegion" />
これから
今日はPrism自習の先のコンテンツをどんどん進めていきます。 また、DIに関してもう一度学び直して、しっかり理解した方がいいと感じたので、並行してお勉強します。