如何通过绑定填充ContentPresenter

How to fill ContentPresenter by binding

我有连接问题。

我开始将我的 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.

中添加的所选项目选项卡内容

在大多数情况下 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 属性。

另外,你也可以删除你在TabControl.Resources中输入的DataTemplate for TabItem。这不是 DataTemplate 的目的;您使用 DataTemplates 为视图模型 类 定义可视化表示,但 TabItem 是一个控件。它已经知道如何显示自己,而实际上 DataTemplate 被忽略了,所以最好不要把它留在那里;您以后只会浪费时间对其进行更改并试图弄清楚为什么它没有任何效果。如果没有它,您的 TabItems 将正确显示。

试试这样的东西?

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

编辑

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