0

好的,这是我的简单场景。我有一组字符串,我绑定到 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

4

3 回答 3

2

您需要对添加到该区域的至少一项内容调用 region.Activate(stuffIJustAddedToTabsControl)。我将同步选项卡控件和区域。否则它看起来很疯狂并且表现更糟。

于 2009-09-23T12:59:41.643 回答
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),但设置相同。

于 2009-09-24T01:35:57.497 回答
0

好的,我有一些可行的方法,但我想看看 Anderson Imes 想出了什么。

基本上,当我的 tabItems 使用数据绑定生成时,我在代码中设置了所有区域内容。

  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);

  }
于 2009-09-23T14:28:06.337 回答