如何通过绑定填充ContentPresenter

时间:2016-08-25 13:26:04

标签: c# wpf tabcontrol 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”函数中添加的所选项目标签内容。

2 个答案:

答案 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" />