WPF样式和工具提示问题

时间:2010-12-02 15:37:01

标签: wpf binding styles

我使用的样式用于在某些文本框上制作动态工具提示。

<Style TargetType="{x:Type TextBox}">
  <Setter Property="MinWidth" Value="100"/>
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">

      <!-- item of interest -->
      <Setter Property="ToolTip">
        <Setter.Value>
          <MultiBinding Converter="{StaticResource ErrorMessageConverter}">
            <Binding RelativeSource="{RelativeSource Self}" Path="Tag"/>
          </MultiBinding>
        </Setter.Value>
      </Setter>

    </Trigger>
  </Style.Triggers>
</Style>

这非常有效,但如果我想使用更复杂的工具提示,我无法弄清楚如何为转换器值绑定到'Tag'。例如;

...
<Setter Property="ToolTip">
  <Setter.Value>
    <StackPanel>
      <TextBlock>
        <TextBlock.Text>
          <MultiBinding Converter="{StaticResource ErrorMessageConverter}">

            <!-- item of interest -->
            <Binding RelativeSource=" what goes here?? "/>
          </MultiBinding>
        </TextBlock.Text>
      </TextBlock>
      <Image/>
    </StackPanel>
  </Setter.Value>
</Setter>
...

我尝试过几种“FindAncestor”,而不是相关来源,但我无法解决任何问题。任何想法??


更新:12-29-2010:这是正确的代码,答案由我们的朋友Goblin提供。效果很好!

...
<Setter Property="ToolTip">
  <Setter.Value>
    <!-- Item of interest -->
      <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
      <StackPanel>
        <Image/>
        <TextBlock>
          <TextBlock.Text>
            <MultiBinding Converter="{StaticResource ErrorMessageConverter}">
              <Binding Path="Tag"/>
            </MultiBinding>
          </TextBlock.Text>
        </TextBlock>
      </StackPanel>
    </ToolTip>
  </Setter.Value>
</Setter>
...

3 个答案:

答案 0 :(得分:3)

有关如何从工具提示继承“拥有”控件的DataContext的完整说明,请参阅Karl Shifflett:http://karlshifflett.wordpress.com/2007/12/29/wpf-sample-series-data-binding-in-tooltip/

这不完全是教科书的东西:)

答案 1 :(得分:2)

问题是ToolTips是主视觉树之外的弹出窗口,当查找ToolTip之外的元素时,会导致RelativeSource和ElementName中断。最简单的方法是使用继承的DataContext作为Bindings,因为它传递给ToolTip,但这并不总能提供对所需内容的访问。

另一种方法是使用FrameworkMetadataOptions.Inherits声明的自定义附加属性。然后,您可以在所有者对象上设置该属性的值(在本例中为TextBox),然后在ToolTip内的任何元素上访问继承的值。在这种情况下,您可以设置Attached Property值而不是Tag。

答案 2 :(得分:0)

尝试使用工具提示在控件上使用x:Name,然后使用<Binding ElementName="yourName" Path="Tag">进行绑定。