2013-04-17 2 views
2

Я хочу, чтобы в текстовых полях отображался конкретный текст в виде подсказки в зависимости от статуса проверки. Для этого я в настоящее время использую следующий код и он работает:Wpf TextBox style with tooltip

<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

Я не полностью проверил это, но вы можете использовать прикрепленное свойство Нечто вроде:

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

Спасибо за ваш ответ, я не могу получить связывание в стиле работы, я попытался ' ', но я получаю ошибку" Свойство путь недопустим. «ToolTipHelper» не имеет открытого свойства с именем «ToolTip». «Я создал ToolTipHelper в соответствии с [link] (http://msdn.microsoft.com/en-us/library/ms753957.aspx?cs-save-lang= 1 & cs-lang = csharp # code-snippet-1). Любая идея, что я делаю неправильно? – dbostream

+0

Скорее всего, вы не предоставили правильные аргументы методу RegisterAttached. 1. Имя свойства без «Свойство», 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 к Tag собственности каждого конкретного TextBox

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