2013-04-17 77 views
2

我希望我的文本框根据验证状态将特定文本显示为工具提示。要做到这一点,我目前使用下面的代码和它的作品:带工具提示的Wpf TextBox样式

<TextBox Name="textBox1"> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="False"> 
        <Setter Property="ToolTip" Value="{Binding XPath=HelpText/Description, Mode=OneTime}" /> 
       </Trigger> 
       <Trigger Property="Validation.HasError" Value="True"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

如果没有错误,则显示从一个XML文件中读取的描述文字,当有显示验证错误串中的错误。

问题是现在我必须复制这个样式并将其应用到每个文本框(并更改XPath,它对每个文本框都是唯一的),我想要做的就是将样式放在Window.Resources中这样我就可以只引用它像这样每一个文本框:

<TextBox Name="textBox2" Style="{StaticResource TextBoxStyle}" /> 

但XPath的将是每一个文本框,所以我不能只是把我的风格Window.Resources不同。如何在样式中提供特定于实例的XPath?有没有办法做到这一点,而不创建一个新的文本框并从TextBox派生?我想知道在这种情况下是否可以使用附加属性,但我不知道它们是如何工作的。

在此先感谢。

回答

2

我还没有完全测试这个Tag属性,但你可以使用附属物 类似于:

class ToolTipHelper { 
    public static readonly DependencyProperty ToolTipProperty = 
      DependencyProperty.RegisterAttached("ToolTip", typeof(string) ... 

然后您修改触发器:

<Trigger Property="Validation.HasError" Value="False"> 
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ToolTipHelper.ToolTip}, Mode=OneTime}" /> 
</Trigger> 

你使用它像

<TextBox ToolTipHelper.ToolTip="{Binding XPath=HelpText/Description, Mode=OneTime}" /> 
+0

感谢您的回复,我不能在风格结合的工作,我已经试过'<二传手Property =“ToolTip”Value =“{Binding RelativeSource = {RelativeSource Self},Path =(local:ToolTipHelper.ToolTip),Mode = OneTime}”/>'但我得到错误“属性路径无效。 'ToolTipHelper'没有一个名为'ToolTip'的公共属性。“我根据[link]创建了ToolTipHelper(http://msdn.microsoft.com/en-us/library/ms753957.aspx?cs-save-lang= 1&cs-lang = csharp#code-snippet-1)。任何想法我做错了什么? – dbostream

+0

最有可能你没有提供适当的参数给RegisterAttached方法1.没有“Property”,2 。属性值的类型3.属性的所有者类“ToolTipHelper”4.具有至少默认值的元数据 – dowhilefor

+0

谢谢我注意到我使用了错误的所有者类,我也必须将绑定模式更改为OneWay,当我使用OneTime时,工具提示总是显示默认文本。再次感谢您的帮助。 – dbostream

0

您可以使用Tag Property,并改变你的风格,以

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" /> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="True"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

然后绑定所需的XPath到每一个具体TextBox

<TextBox Tag="{Binding XPath=HelpText/Description, Mode=OneTime}" />