2012-11-11 45 views
3

我正在实施搜索文本框;你能帮我绑定到TextBox.Tag吗?如何将wpf中的样式绑定到标记?

风格

<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" /> 

我怎样才能绑定工作?

回答

2

这里这篇文章是非常类似于你: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" /> 
+0

谢谢你,比尔。我发现你的方法是创建模板... –

+0

不客气。正如塞缪尔杰克在我提供的链接中所说的,如果您在风格中使用资源,那么它们只会被实例化一次。所以,如果你有多个文本框,那么他们总是有相同的'提示'文本。 –

+0

是的,我注意到了!我的第一个实现是通过附加属性,它有默认文本!))))再次感谢你。 –

相关问题