2013-04-28 2 views
0

Я хочу создать триггер, который будет применяться ко всем TextBox на Validation.HasError, чтобы показать Validation.Error в пользовательской подсказке.привязка к цели стиля с использованием RelativeSource в Setter.Value

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="Background" Value="Red"/> 
     <Setter Property="ToolTip"> 
      <Setter.Value> 
       <StackPanel> 
        <TextBlock Text="{Binding RelativeSource={RelativeSource XXX}, Path=(Validation.Error)[0].ErrorContent}"/> 
       </StackPanel> 
      </Setter.Value> 
     </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Что я должен поставить в XXX?

Моя проблема в том, что я действительно не понимаю, как RelativeSource работает в этом контексте, и я не могу получить правильный код для привязки к TextBox.

Я предполагаю, что Self будет ссылаться на TextBlock и FindAncestor x: Тип TextBox будет терпеть неудачу, потому что он будет проходить через TextBlock> StackPanel> Setter.Value> Setter> и т. Д. Вместо этого.

Как я могу ссылаться на цель стиля?

ответ

2

С ToolTip не является частью визуального дерева, это немного громоздко, чтобы получить нужное поведение.

Свойство PlacementTarget можно найти, чтобы найти элемент, к которому прикреплен, и установить его DataContext. В вашем случае это будет TextBox.

Теперь вы можете напрямую связаться с недвижимостью Validation.Errors, и она найдет ошибки при оценке по данному TextBox.

Вы можете использовать следующий код, чтобы заставить его работать:

<Window.Resources> 
    <ToolTip x:Key="errorTooltip" 
      DataContext="{Binding PlacementTarget, 
            RelativeSource={RelativeSource Self}}"> 
     <StackPanel> 
      <TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent}" /> 
     </StackPanel> 
    </ToolTip> 

    <Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="True"> 
       <Setter Property="Background" Value="Red"/> 
       <Setter Property="ToolTip" Value="{StaticResource errorTooltip}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
Смежные вопросы