好的,这是我的简单方案。我有一些字符串集合,我绑定到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实际上会注入我的文本块......但是在标签之间会出现一些奇怪的行为。
我更改了它,因此我可以选择要注入的区域和文本。它总是适用于我创建的第一个区域,但在此之后,在标签之间翻转只会显示我添加到第一个区域的内容。选项卡控件是否在多个选项卡中重复使用我的datatemplate?我已经包含了ViewModel中的所有代码。 DynamicRegions只是一个ObservableCollection
答案 0 :(得分:2)
您需要至少在添加到该区域的一项内容上调用region.Activate(stuffIJustAddedToTabsControl)。我将获得选项卡控件和区域同步。否则它看起来都很疯狂,而且行为更糟。
答案 1 :(得分:1)
使TabControl成为适合您的区域吗?这样您就可以向该视图添加区域。如果这些视图需要一个区域,只需创建一个子/嵌套区域并查看注入。我真的从来不需要动态创建区域......
<TabControl cal:RegionManager.RegionName="TabRegion" x:Name="tabDemo" ItemsSource="{Binding Something}" >
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
Prism中的StockChartsRI显示了如何从视图模型中直接绑定选项卡的标题。他们使用TabPanel(AnimatedTabPanel)的子类,但设置是相同的。
答案 2 :(得分:0)
好的,我有一些有用的东西,但我想看看Anderson Imes想出了什么。
基本上,当我使用数据绑定生成tabItem时,我在代码中设置了所有区域内容。
private void AddDynamicRegion(object arg)
{
var newRegionName = "Region" + (DynamicRegions.Count + 1).ToString();
DynamicRegions.Add(newRegionName);
var tabItem = View.tabDemo.ItemContainerGenerator.ContainerFromIndex(DynamicRegions.Count - 1) as TabItem;
var newRegionContainer = new ItemsControl();
RegionManager.SetRegionName(newRegionContainer,newRegionName);
RegionManager.SetRegionManager(newRegionContainer, _regionManager);
tabItem.Content = newRegionContainer;
}
然后在插入中我可以这样做,一切都显示在正确的区域下。我想知道是否有更好的方法来做到这一点。
private void AddRandomRegionContent(object arg)
{
if (string.IsNullOrEmpty(SelectedRegion) )
return;
Debug.WriteLine("Injected " + RegionContent + " into " + SelectedRegion);
var newContent = new TextBlock() { Text = RegionContent };
var region = _regionManager.Regions[SelectedRegion];
if (region == null)
{
Debug.WriteLine("Couldn't find region");
return;
}
region.Add(newContent);
region.Activate(newContent);
}
答案 3 :(得分:0)
您可以查看this article,其中涉及类似的问题。