2013-04-17 117 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}" />