【问题标题】:WPF Styles and Tooltips QuestionWPF 样式和工具提示问题
【发布时间】:2010-12-02 15:37:00
【问题描述】:

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

<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>

这很好用,但如果我想使用更复杂的工具提示,我不知道如何为转换器值绑定到“标签”。例如;

...
<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”的风格,但对于相对来源,我什么也做不了。有什么想法吗??


更新:2010 年 12 月 29 日:这是正确的代码,下面是我们的朋友 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>
...

【问题讨论】:

  • 更新:无论我将值绑定设置为什么,似乎都没有在这种安排中调用转换器。但是,应用程序在运行时不会报告异常。这只会增加谜团。
  • 不是真的 - 这是因为 TextBlock 的 DataContext 为空 - 因此绑定在设置 DataContext 之前处于“休眠”状态。

标签: wpf binding styles


【解决方案1】:

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

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

【讨论】:

  • 很抱歉在尝试这个过程中耽搁了很长时间。毕竟,这个项目被排在了我名单的底部。无论如何,在阅读完这篇文章后,这正是我想要的。我用工作代码更新了我的问题。谢谢!
  • 不用担心 - 很高兴我能帮上忙 :-)
【解决方案2】:

问题在于,工具提示是存在于主视觉树之外的弹出窗口,这会导致在查找工具提示之外的元素时,RelativeSource 和 ElementName 都会中断。解决此问题的最简单方法是将继承的 DataContext 用于您的绑定,因为它会传递到 ToolTip,但这并不总是可以访问您需要的内容。

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

【讨论】:

  • 我了解存在于主可视树等之外的工具提示,但 XAML 的第一个块实际上可以工作,因此似乎有一种方法可以获取工具提示本身内的标记属性。为什么在第一种情况下可以访问,而在第二种情况下不能访问?
  • 第一个块不在工具提示内。它在 TextBox 上设置一个属性,就像你做了
  • 哦,我明白了,我猜这是 XAML 结构的错觉。呃。我想我会考虑你的第一个建议。
【解决方案3】:

尝试在带有工具提示的控件上使用x:Name,然后使用&lt;Binding ElementName="yourName" Path="Tag"&gt; 进行绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2023-01-26
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多