2013-04-28 60 views
0

我想创建一个触发器应用于Validation.HasError上的所有TextBox,以在自定义工具提示中显示Validation.Error。使用Setter中的RelativeSource绑定到样式目标值

<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如何在这种情况下工作,我无法获得正确的代码绑定到文本框。

我猜自我会引用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> 
相关问题