私が思いついた解決策は、各ビューのインターフェイスを実装し、それを使用するカスタム RegionAdapter を実装することです。
注:このインターフェイスでは、必要に応じてタブ オーダーも指定できます。
public interface ITabItemView
{
int TabItemIndex { get; }
bool IsStartupTab { get; }
}
public class TabControlRegionAdapter : RegionAdapterBase<TabControl>
{
private ITabItemView startupTab = null;
public TabControlRegionAdapter(IRegionBehaviorFactory factory)
: base(factory)
{
}
protected override void Adapt(IRegion region, TabControl regionTarget)
{
region.Views.CollectionChanged += (s, e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
var items = regionTarget.Items;
foreach (ITabItemView tab in e.NewItems)
{
if (tab.TabItemIndex > items.Count)
items.Add(tab);
else
items.Insert(tab.TabItemIndex, tab);
if (tab.IsStartupTab)
{
if (tab != startupTab && startupTab != null)
throw new InvalidOperationException("More than one tab is the startup tab.");
startupTab = tab;
regionTarget.SelectedItem = tab;
}
}
}
};
}
protected override IRegion CreateRegion()
{
return new AllActiveRegion();
}
}
もちろん、Bootstrapper クラスでは必要です
protected override Microsoft.Practices.Prism.Regions.RegionAdapterMappings ConfigureRegionAdapterMappings()
{
var mappings = base.ConfigureRegionAdapterMappings();
mappings.RegisterMapping(typeof(TabControl), Container.Resolve<TabControlRegionAdapter>());
return mappings;
}