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>
我在oneExpander
上直接定义了此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>