使用绑定更改 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}">
我创建了一个自定义控件,它是一个 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}">