如何以按钮样式将这个 Textblock 绑定到 ControlTemplate 中?

问题描述

我有一个 Button 样式,该样式包含一个图标和一个文本。我想绑定文本。 我怎样才能做到这一点?

<Style targettype="{x:Type Button}" x:Key="ConnectedButton">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="FlowDirection" Value="LeftToRight"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate targettype="{x:Type Button}">
                <Border Padding="5 0" 
                        Width="80"
                        Height="30"
                        Margin="5">
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                        <TextBlock Text="{Binding Connect}"  
                                   Margin="3 0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        <TextBlock Text="{StaticResource ConnectIcon}" 
   
                                   Style="{StaticResource Icon_Text}"  Margin="3 0"
                                   HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用 MainWindow.xaml 中的样式:

  <Button Style="{StaticResource ConnectedButton}" Margin="10,15,10" x:Name="cnct_btn" Content="{StaticResource Connect}"  Height="40" Width="80 " HorizontalAlignment="Left" VerticalAlignment="Center"  Click="Cnct_Click"/>

MainWindow.xaml.cs

bool test = false;
//...

if (test)
{
   cnct_btn.Content = "Connect";
}
else 
{
   cnct_btn.Content = "Not Connected";
}

我尝试过 Text={Binding Connect} 但它不起作用。

解决方法

在控件模板中,您必须使用 TemplateBinding 来访问模板化控件上的属性。如果是 Button,则是您要绑定的 Content 属性。

实现一个标记扩展,该扩展支持模板中属性的值与模板化控件上的某些其他公开属性的值之间的绑定。

<TextBlock Text="{TemplateBinding Content}"  
           Margin="3 0" HorizontalAlignment="Center" VerticalAlignment="Center"/>

一个简单的 Binding 将解析当前数据上下文中的属性。您也可以进行此操作,但您需要使用 RelativeSource 指定 TemplatedParent

TemplatedParent - 指应用模板(数据绑定元素存在于其中)的元素。 这类似于设置 TemplateBindingExtension,并且仅适用于绑定在模板内的情况

<TextBlock Text="{Binding Content,RelativeSource={RelativeSource TemplatedParent}}"  
           Margin="3 0" HorizontalAlignment="Center" VerticalAlignment="Center"/>

请注意,在这种情况下,TemplateBinding 就足够了,as it is only one way。在双向绑定中,您必须使用使用 RelativeSourceTemplatedParent 的变体。

A TemplateBinding 是针对模板场景的 Binding 的优化形式,类似于使用 {Binding RelativeSource={RelativeSource TemplatedParent},Mode=OneWay} 构造的 Binding。 TemplateBinding 始终是单向绑定,即使涉及的属性默认为双向绑定。涉及的两个属性都必须是依赖属性。为了实现对模板化父项的双向绑定,请使用以下绑定语句代替 {Binding RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay,Path=MyDependencyProperty}