我该如何在WPF中从样式绑定到标签?

3

我正在实现一个搜索文本框,你能帮我绑定到TextBox.Tag上吗?

样式

<Style x:Key="SearchTextBox" TargetType="{x:Type TextBox}">
      <Style.Resources>
       <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
          <VisualBrush.Visual>
            <Label Content="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" Foreground="{StaticResource SearchTextBox.Foreground}" FontSize="{StaticResource SearchTextBox.FontSize}"/>
          </VisualBrush.Visual>
        </VisualBrush>
      </Style.Resources>
      <Setter Property="FontSize" Value="{StaticResource SearchTextBox.FontSize}" />
      <Setter Property="Foreground" Value="{StaticResource SearchTextBox.TextForeground}" />
      <Setter Property="MinWidth" Value="200" />
          <Style.Triggers>
            <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
              <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
            </Trigger>
            <Trigger Property="Text" Value="{x:Null}">
              <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
            </Trigger>
            <Trigger Property="IsKeyboardFocused" Value="True">
              <Setter Property="Background" Value="White" />
            </Trigger>
          </Style.Triggers>
    </Style>

使用方法

<TextBox Style="{StaticResource SearchTextBox}" Tag="Search templates" />

我应该如何使绑定生效?
1个回答

3
这篇文章与你的非常相似:WPF Bind to parent property from within nested element using style 不过,它并没有提供代码示例,所以这里有一些你可以用作替代当前方法的 XAML 代码。
<Style x:Key="SearchTextBox" BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
  <Style.Setters>
    <Setter Property="Tag" Value=""/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TextBox}">
          <Grid>
            <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
            <TextBlock x:Name="textBlock" Opacity="0.345" Text="{TemplateBinding Tag}" TextWrapping="Wrap" Visibility="Hidden" />
          </Grid>
          <ControlTemplate.Triggers>
            <MultiTrigger>
              <MultiTrigger.Conditions>
                <Condition Property="IsFocused" Value="False" />
                <Condition Property="Text" Value="" />
              </MultiTrigger.Conditions>
              <Setter Property="Visibility" TargetName="textBlock" Value="Visible" />
            </MultiTrigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style.Setters>
</Style>

“而且你仍然会以原来的方式编写文本框代码:”
<TextBox Style="{StaticResource SearchTextBox}" Tag="Search templates" />

欢迎。正如我提供的链接中Samuel Jack所述,如果您按样式使用资源,则它们仅实例化一次。因此,如果您有多个文本框,则始终会具有相同的“提示”文本。 - Bill Tarbell
是的,我注意到了!我的第一个实现是通过附加属性,并且它有默认文本!)))) 再次感谢您。 - Siarhei Kuchuk
非常感谢您的精彩回答。现在一切都正常了,太好了!谢谢你,大师! - Siarhei Kuchuk
再次感谢...我只是将同样的东西添加到其他东西中,它运行得非常顺畅和棒极了))) - Siarhei Kuchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接