C# 模板中的绑定属性

C# 模板中的绑定属性,c#,wpf,xaml,templates,C#,Wpf,Xaml,Templates,对于扩展器,我有以下头模板: <Expander.HeaderTemplate> <DataTemplate> <Grid Background="#939393"> <Grid.RowDefinitions> <RowDefinition Height="22"/> </Grid.RowDefinitions>

对于
扩展器
,我有以下
头模板

<Expander.HeaderTemplate>
    <DataTemplate>
        <Grid Background="#939393">
            <Grid.RowDefinitions>
                <RowDefinition Height="22"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <Style TargetType="{x:Type ToggleButton}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ToggleButton}">
                                <Border HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="border" CornerRadius="5,5,5,5" 
                                        Background="Transparent" BorderBrush="#FF000000" Margin="1" BorderThickness="1,1,1,1" SnapsToDevicePixels="True">
                                    <ContentPresenter x:Name="contentPresenter"/>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsChecked" Value="true">
                                        <Setter Property="Background" TargetName="border" Value="DarkGray"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Grid.Resources>
            <TextBlock Grid.Column="0" Background="#6E6E6E"/>
            <ToggleButton Grid.Column="0" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType=Expander}}" Focusable="False">
                <Image Source="{Binding IsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType=Expander}, Converter={StaticResource boolToExpanderDirectionConverter}}"/>
            </ToggleButton>
            <TextBlock Grid.Column="1" Text="General" Margin="5,1,1,1" VerticalAlignment="Top" FontWeight="Bold"/>
        </Grid>
    </DataTemplate>
</Expander.HeaderTemplate>

我在one
Expander
上直接定义了此Headertemplate。现在,我想将此模板移动到一个资源,并将其应用于所有扩展器。我现在的问题是,我不知道如何将模板中
TextBlock
的标题设置为
扩展器的标题


我知道有一种方法可以使用
模板绑定
,但不幸的是,我不知道如何使用它

您可以通过下面的代码了解模板绑定,这些代码是我在学习XAML时实现的

<Button Template="{DynamicResource CircleButton}" Background="Green" Content="1"></Button>

<ControlTemplate x:Key="CircleButton" TargetType="{x:Type Button}">
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center" MinHeight="36" MinWidth="36">
            <Ellipse Fill="{TemplateBinding Background}"></Ellipse>
            <ContentPresenter TextBlock.FontFamily="Calibri" TextBlock.FontSize="24" TextBlock.Foreground="Wheat" HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
        </Grid>

您必须为控件模板提供一个x:Key,并且当您将其与某个特定元素绑定时,在此处定义该x:Key,就像我在Template=“{DynamicResource CircleButton}”中所做的那样

你的情况如下:

<Style  TargetType="{x:Type Expander}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Expander}">
                     // Do your thing.
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

//做你的事。
这将适用于整个应用程序中的所有扩展器。您可以将此样式放入App.xaml文件中,以便于代码清理。希望这对你有帮助

TemplateBinding只能在ControlTemplate中使用。TemplateBinding用于绑定到模板定义中的元素属性

在您的示例中,您使用了用于切换按钮的controltemplate

模板绑定的示例

   <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                            <ContentPresenter TextElement.Foreground="{TemplateBinding Foreground}" x:Name="contentPresenter"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            .....
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
    </Style>

<ToggleButton Grid.Column="0" Background="Red" BorderBrush="Black" BorderThickness="1" Foreground="White"/>

.....
在这里,Border和ContentPresCenter将绑定ToggleButton的属性,该属性在其定义中已定义


但在您的示例中,您使用了Datatemplate..因此您不能使用TemplateBinding..请遵循以下绑定语法

您示例的解决方案

使用绑定语法,我们可以将Header属性绑定到不同的exapnder Text=“{Binding Path=Header,RelativeSource={RelativeSource AncestorType={x:Type Expander}}}”


由于您是通过DataTemplate指定HeaderTemplate,因此该模板的DataContext就是标头。以下是一个简单的例子:

<Expander Header="Test">
    <Expander.HeaderTemplate>
        <TextBlock Text="{Binding}"/>
    </Expander.HeaderTemplate>
</Expander>

<Expander Header="Test">
    <Expander.HeaderTemplate>
        <TextBlock Text="{Binding}"/>
    </Expander.HeaderTemplate>
</Expander>