Prism コードサンプル学習:05-ViewInjection
はじめに
以下の記事の続きです。
https://qiita.com/mngreen/items/d4164e0107fd5b69b1c9
05-ViewInjection
本サンプルではRegionManagerクラスを用いて、対象regionにViewを追加します。
<Windowx:Class="ViewInjection.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/"Title="Shell"Height="350"Width="525"><DockPanelLastChildFill="True"><ButtonDockPanel.Dock="Top"Click="Button_Click">Add View</Button><ContentControlprism:RegionManager.RegionName="ContentRegion"/></DockPanel></Window>/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>publicpartialclassMainWindow:Window{IContainerExtension_container;IRegionManager_regionManager;publicMainWindow(IContainerExtensioncontainer,IRegionManagerregionManager){InitializeComponent();_container=container;_regionManager=regionManager;}privatevoidButton_Click(objectsender,RoutedEventArgse){varview=_container.Resolve<ViewA>();IRegionregion=_regionManager.Regions["ContentRegion"];region.Add(view);}}- [Add View]ボタンを押下することで、ContentRegionにViewが追加されます。
- regionManager.Regionsプロパティにインデクサでアクセスすることで対象のregionを取得できます。
- このように対象のregionを取得できるのは添付プロパティであるRegionManager.RegionNameプロパティに値がセットされたタイミングでRegionを生成するメソッドが呼び出されるため。
- 正確にはそこで生成されたDelayedRegionCreationBehaviorがやってくれる
- region.Addメソッドでviewが追加されると巡り巡ってInnerAddメソッドが呼び出される。
- viewはItemMetadataクラスとしてラップされてItemMetadataCollectionに追加される。viewNameを合わせて付与される。
- ItemMetadataCollectionが変更されると、ViewsCollectionがItemMetadataCollectionによって生成されているため、そちらのハンドラ(ViewsCollection.SourceCollectionChangedメソッド)で処理される。これにより、ただregion.Addしているだけのように見えるが、CollectionChangedイベントが発火されてUIが更新される。
おわりに
今回はRegionManager, Regionクラスのソースコードを中心に読みました。
DependencyPropertyを利用してアタッチされたタイミングでRegionを生成するといった工夫をすることで、利用者側が便利になる工夫が見られました。
次回、06-ViewActivationDeactivationについて見ていこうと思います。