2010-12-02 14 views
2

私は、特定のテキストボックスに動的なツールチップを作成するために使用しているスタイルを持っています。WPFスタイルとツールチップ質問

<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」と何のいくつかの味を試してみましたが、私は何も動作させることはできません。何か案は??


更新日:12-29-2010:ここに正しいコード、私たちの友人ゴブリンによって提供される答えです。完璧に動作します!

... 
<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> 
... 
+0

UPDATE:それはと思われますコンバータは、私が値バインディングを設定していても、この配置で呼び出されていません。ただし、アプリケーションの実行中に例外が報告されることはありません。これは謎にだけ追加されます。 –

+0

これは、TextBlockのDataContextがnullなので、DataContextが設定されるまでバインディングがスリープ状態になるためです。 – Goblin

答えて

3

ヒントから「所有する」コントロールのDataContextのを継承する方法についての詳しい説明を参照カールShifflett:http://karlshifflett.wordpress.com/2007/12/29/wpf-sample-series-data-binding-in-tooltip/

それはまさに教科書のものではありません:)

+0

申し訳ありませんが、これを試すには長い時間がかかります。結局のところ、プロジェクトは私のリストの一番下にぶつかった。とにかく、記事を読んだ後、これはまさに私が探していたものです。私は作業コードで質問を更新しました。ありがとう! –

+0

心配なし - 私は助けてくれるとうれしいです:-) – Goblin

0

ツールチップで制御上x:Nameを使用してみてください、その後、結合のための<Binding ElementName="yourName" Path="Tag">

+0

悲しいことに私はすでにこのアプローチを試しました。 –

+0

なぜですか?あなたが試したときにどんな束縛エラーがありましたか? –

2

問題は、主ヒントツリーの外に存在するポップアップで、ツールヒント外の要素を検索するときにRelativeSourceとElementNameの両方が壊れてしまうことです。これを回避する最も簡単な方法は、Bindingsの継承されたDataContextをToolTipに渡すときに使用することですが、これは常に必要なものにアクセスするとは限りません。

FrameworkMetadataOptions.Inheritsで宣言されたカスタムのAttachedプロパティを使用する方法もあります。次に、所有者オブジェクト(この場合はTextBox)でそのプロパティの値を設定し、ツールチップ内の任意の要素の継承された値にアクセスできます。この場合、タグの代わりにAttached Propertyの値を設定します。

+0

主なビジュアルツリーの外にあるツールチップについては理解していますが、XAMLの最初のブロックが実際に機能するので、ツールチップ自体のタグプロパティを取得する方法があるようです。最初のケースではアクセス可能ですが、2番目ではアクセスできないのはなぜですか? –

+1

最初のブロックがツールヒントの内側にありません。あなたが

+0

ああ、私は、 XAML。デュ。あなたの最初の提案を調べてみましょう。 –