Prism コードサンプル学習:05-ViewInjection
はじめに
以下の記事の続きです。
https://qiita.com/mngreen/items/d4164e0107fd5b69b1c9
05-ViewInjection
本サンプルではRegionManagerクラスを用いて、対象regionにViewを追加します。
<Window x: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">
<DockPanel LastChildFill="True">
<Button DockPanel.Dock="Top" Click="Button_Click">Add View</Button>
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
</DockPanel>
</Window>
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
IContainerExtension _container;
IRegionManager _regionManager;
public MainWindow(IContainerExtension container, IRegionManager regionManager)
{
InitializeComponent();
_container = container;
_regionManager = regionManager;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var view = _container.Resolve<ViewA>();
IRegion region = _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が更新される。
- このように対象のregionを取得できるのは添付プロパティであるRegionManager.RegionNameプロパティに値がセットされたタイミングでRegionを生成するメソッドが呼び出されるため。
おわりに
今回はRegionManager, Regionクラスのソースコードを中心に読みました。
DependencyPropertyを利用してアタッチされたタイミングでRegionを生成するといった工夫をすることで、利用者側が便利になる工夫が見られました。
次回、06-ViewActivationDeactivationについて見ていこうと思います。