2016-08-25 51 views
0

我有一个连接问题。如何通过绑定填充ContentPresenter

我开始将我的tabstabcontrol.ressources连接起来,它可以显示每个标签的文本。 后来我想有一个滚动我TabItems和它不工作,没有任何显示在标签......我甚至无法使用tabcontrol.ressources了...

<DockPanel> 
    <Button Background="DarkGoldenrod" Height="Auto" Command="{Binding OpenFlyoutDataCommand}"> 
     <StackPanel> 
      <materialDesign:PackIcon Kind="ArrowRightBoldCircleOutline" Width="30" Height="30"/> 
     </StackPanel> 
    </Button> 
    <TabControl ItemsSource="{Binding TabEDCWaferData, Mode=TwoWay}" 
       SelectedItem="{Binding SelectedTabEDCWaferData}"> 

     <!-- Used to create a scroolbar for tabitems --> 

     <TabControl.Template> 
      <ControlTemplate TargetType="TabControl"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden" > 
         <TabPanel Grid.Column="0" Grid.Row="0" 
            Margin="2,2,2,0" IsItemsHost="true"/> 
        </ScrollViewer> 
        <ContentPresenter ContentSource="..."/> 
       </Grid> 
      </ControlTemplate> 
     </TabControl.Template> 

     <!-- Contains the text in the tab item ! --> 

     <TabControl.Resources> 
      <DataTemplate DataType="TabItem"> 
       <DockPanel> 
        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Content}" /> 
       </DockPanel> 
      </DataTemplate> 
     </TabControl.Resources> 

    </TabControl> 
</DockPanel> 

这就是连接的集合TabItem,我有一个功能可以将Items绑定到另一个按钮上。

private ObservableCollection<TabItem> _TabEDCWaferData; 
    public ObservableCollection<TabItem> TabEDCWaferData 
    { 
     get { return _TabEDCWaferData; } 
     set 
     { 
      _TabEDCWaferData = value; 
      RaisePropertyChanged("TabEDCWaferData"); 
     } 
    } 

    public void AddTabItem(string name) 
    { 
     TabItem tab = new TabItem(); 
     tab.Header = name; 
     tab.Content = "Temporary content"; 
     TabEDCWaferData.Add(tab); 
    } 

我读到我必须使用ContentPresenter,但我不知道该怎么绑定。我认为这不适用于TabItems ... 我只想按照我在Ressources中通过使用ContentPresenter来绑定它。

我希望我很清楚!谢谢

编辑:我试着在ContentPresenter显示我添加到函数AddTabItem中的选定的项目标签内容。

+0

也许TemplateBinding来的TabControl的内容属性? – Mathieu

+0

等一下,你想用ContentPresenter来做什么?显示当前选择的选项卡项目? –

+0

是的,确切!这是我试图解释的,显示当前选定的标签项目内容。 – Destunk

回答

1

随着ContentPresenter,大部分时间,这不会工作:

<ContentPresenter /> 

默认ContentSource"Content"。这意味着它会查看模板父级的Content属性,并且它会将其所找到的任何内容用于其自己的内容。

但是,这并不能帮助你,并且你没有使用ContentPresenter;这只是一个方便。在这种情况下,您要呈现的内容是SelectedItem.Content,对于ContentPresenter这不是有效的ContentSource。但是你可以做同样的事情在ContentControl绑定来代替:

<TabControl.Template> 
    <ControlTemplate TargetType="TabControl"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <ScrollViewer 
       Grid.Row="0" 
       HorizontalScrollBarVisibility="Auto" 
       VerticalScrollBarVisibility="Hidden" 
       > 
       <TabPanel 
        Grid.Column="0" 
        Margin="2,2,2,0" IsItemsHost="true"/> 
      </ScrollViewer> 
      <ContentControl 
       Grid.Row="1" 
       Content="{Binding SelectedItem.Content, RelativeSource={RelativeSource TemplatedParent}}" 
       /> 
     </Grid> 
    </ControlTemplate> 
</TabControl.Template> 

TemplateBinding是不会有Path如“SelectedItem.Content”工作;它只接受模板父级的属性名称。我也修正了Grid.Row属性。

此外,你可以删除DataTemplateTabItem,你把它放在TabControl.Resources。这不是DataTemplate的目的;您使用DataTemplates来为视图模型类定义可视化演示文稿,但TabItem是一个控件。它已经知道如何显示自己,实际上DataTemplate正在被忽略,所以最好不要放在那里;你以后只会浪费时间对它进行修改,并试图弄清为什么它没有任何效果。没有它,你的TabItem将会正确显示。

+0

我在网上找到了'ContentPresenter',但很明显,这是错误的。谢谢,这是完美的解决方案!我怎样才能摆脱'DataTemplate'?我必须承认,我是WPF的初学者。你能给我举个例子吗? – Destunk

+0

@DesTunK只需从'TabControl.Resources'中删除'DataTemplate'元素即可。没有任何东西可以使用它,所以它没有造成任何伤害,但是它在那里会产生不必要的混淆。 –

+0

对不起,我忘了这部分!我删除了它,因为你用ContentControl替换了它。我同意,当你是像我这样的初学者时,最好删除无用的东西,更容易不会犯错误;) – Destunk

0

尝试这样?

<ContentPresenter Content="{TemplateBinding Content}" /> 

编辑

<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" /> 
+1

成员'Content'不被识别或不可访问,只是'Binding'不起作用 – Destunk