如何通过绑定填充ContentPresenter
本文关键字:ContentPresenter 填充 绑定 何通过 | 更新日期: 2023-09-27 18:03:53
连接有问题
我开始将我的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
…我只是想通过使用ContentPresenter
来绑定它,就像我在Ressources
中做的那样。
我希望我说得够清楚了!由于
EDIT:我尝试在ContentPresenter
中显示我在函数' AddTabItem中添加的选定项目选项卡内容。
对于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
,如" selecteitem . content ";它只接受模板化父组件上的属性名称。我也固定了你的Grid.Row
属性。
同样,您也可以将TabControl.Resources
中的DataTemplate
删除为TabItem
。这不是DataTemplate
的目的;您使用datatemplate为视图模型类定义可视化表示,但TabItem
是一个控件。它已经知道如何显示自己,事实上DataTemplate
被忽略了,所以最好不要把它留在那里;你只会浪费时间去修改它,并试图找出为什么它没有任何效果。没有它,您的TabItem
将正确显示。
试试这样做?
<ContentPresenter Content="{TemplateBinding Content}" />
编辑
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" />