わかりました、これが私の簡単なシナリオです。概念実証として、TabControlにバインドしている文字列のコレクションがあります。文字列を追加するときに、リージョン名をヘッダーとして、ItemsControlをTabコンテナーに含む新しいタブが必要です。そのItemsControlは新しい領域を定義する必要があります。
<TabControl x:Name="tabDemo" ItemsSource="{Binding DynamicRegions}" >
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ItemsControl cal:RegionManager.RegionName="{Binding}" ItemsSource="{x:Null}">
</ItemsControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
そこから、コレクションに文字列を追加します。タブは正常に表示されますが、電話をかけようとすると
private void AddDynamicRegion(object arg)
{
var newRegionName = "Region" + (DynamicRegions.Count + 1).ToString();
DynamicRegions.Add(newRegionName);
}
private void AddRandomRegionContent(object arg)
{
if (string.IsNullOrEmpty(SelectedRegion) )
return;
Debug.WriteLine("Injected " + RegionContent + " into " + SelectedRegion);
var newContent = new TextBlock() { Text = RegionContent };
_regionManager.RegisterViewWithRegion(SelectedRegion,() => newContent );
_regionManager.Regions[SelectedRegion].Activate(newContent);
}
リージョンが存在しないという例外、またはリージョンの作成に失敗し、ItemsControl.ItemsSourceがすでに設定されているという例外がスローされます。これが箱から出してすぐに機能するとは思っていませんでしたが、動的領域を作成して実行時に注入する方法はありますか?
更新:RegisterViewWithRegionを呼び出すと、実際にテキストブロックが挿入されますが、タブ間で奇妙な動作が発生します。
挿入する領域とテキストを選択できるように変更しました。これは、私が作成した最初のリージョンで常に機能しますが、その後、タブを切り替えると、最初のリージョンに追加したものが表示されます。タブコントロールは、データテンプレートを複数のタブで再利用していますか?ViewModelからすべてのコードを含めました。DynamicRegionsは単なるObservableCollectionです