好的,这是我的简单场景。我有一组字符串,我绑定到 TabControl 作为概念证明。当我添加字符串时,我想要一个以区域名称作为标题的新选项卡,并在 Tab 容器中使用 ItemsControl。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