使用绑定更改 TextBox 模板内的 TextBlock

Change TextBlock inside TextBox Template with Binding

我创建了一个自定义控件,它是一个 TextBox,里面包含一个 TexBlock。如果占位符文本 (Directorio Archivo) 为空,则此 TexBlock 消失。它工作正常,非常适合我的初始需求,但现在我需要将该自定义控件与其他占位符文本重用。我是 WPF 的新手,现在对我来说有点不知所措。以下代码显示了针对一种特定情况的工作模板:

        <Style x:Key="DefaultTextBox" TargetType="TextBox">
            <Setter Property="IsReadOnly" Value="True"/>
            <Setter Property="Margin" Value="10, 5"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Border Background="#ffffff" BorderBrush="#000000" BorderThickness="1" CornerRadius="5" >
                            <Grid>
                                <TextBox x:Name="Directorio" Background="Transparent" BorderThickness="0" Margin="5" VerticalContentAlignment="Center" Text="{TemplateBinding Text}"/>
                                <TextBlock Foreground="#828282" HorizontalAlignment="Center" IsHitTestVisible="False" Margin="5" Text="Directorio Archivo">
                                    <TextBlock.Style>
                                        <Style TargetType="{x:Type TextBlock}">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Text, ElementName=Directorio}" Value="">
                                                    <Setter Property="Visibility" Value="Visible"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                            <Setter Property="Visibility" Value="Hidden"/>
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

现在我想重新使用模板并将文本“Directorio Archivo”替换为控件上定义的内容。我要更改的这部分代码:

<TextBlock Foreground="#828282" HorizontalAlignment="Center" IsHitTestVisible="False" Margin="5" Text="{Templatebinding or binding?????}">

现在,如果我可以替换那个调用它的占位符字段的文本,例如:

<TextBox Grid.Row="0" Grid.Column="1" Margin="5,5,20,5" Style="{StaticResource DefaultTextBox}" TextBlock.Text="MyPlaceHolderText"/>

我已经尝试了所有方法,但我很难理解 WPF 的工作原理,而且它的文档也不是很容易理解。

提前致谢

您需要定义一个 custom dependency property 来存储文本的值,或者您可以使用现有的 属性,例如 Tag:

<TextBox ... Tag="Directorio Archivo" />

然后您修改模板以绑定到此 属性:

<TextBlock Foreground="#828282" ... Text="{TemplateBinding Tag}">