2012-11-11 44 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

是的,我注意到了!我的第一個實現是通過附加屬性,它有默認文本!))))再次感謝你。 –

相關問題