我遇到连接问题。
我开始将tabs
与tabcontrol.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 :(得分:2)
大多数情况下ContentPresenter,
,这就完成了工作:
<ContentPresenter />
默认ContentSource
为"Content"
。这意味着它将查看模板化父级的Content
属性,并且它会将其在此处找到的任何内容用于其自己的内容。
但这对你没有任何帮助,你 使用ContentPresenter
;这只是一个方便。在这种情况下,您要呈现的内容为SelectedItem.Content
,而ContentSource
的有效ContentPresenter
不是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
无法使用Grid.Row
,例如&#34; SelectedItem.Content&#34 ;;它只接受模板化父级的属性名称。我也修复了你的DataTemplate
属性。
另外,您也可以删除TabItem
TabControl.Resources
DataTemplate
。这不是TabItem
的用途;您使用DataTemplates为viewmodel类定义可视化表示,但DataTemplate
是一个控件。它已经知道如何展示自己,事实上TabItem
被忽略了,所以最好不要把它留在那里;你以后只会浪费时间对它进行更改并试图弄清楚它为什么没有任何效果。如果没有它,您的type TmyTTable = Class(TTable);
将正确显示。
答案 1 :(得分:0)
尝试这样的事情?
<ContentPresenter Content="{TemplateBinding Content}" />
修改强>
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" />