2010-12-02 8 views
2

J'ai un style que j'utilise pour créer des infobulles dynamiques sur certaines zones de texte.Styles et info-bulles WPF Question

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

Cela fonctionne très bien, mais si je veux utiliser une infobulle plus complexe que je ne peux pas comprendre comment lier à « Tag » plus la valeur du convertisseur. Par exemple;

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

J'ai essayé plusieurs saveurs de « FindAncestor » et ce pas la source relative, mais je ne peux pas trouver quelque chose à travailler. Des idées??


MISE À JOUR: 12-29-2010: Voici le code correct, réponse fournie par notre ami Goblin ci-dessous. Fonctionne parfaitement!

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

MISE À JOUR: Il semble que le convertisseur n'est pas appelé dans cet arrangement, peu importe ce que je définis la valeur de liaison. Toutefois, aucune exception n'est signalée par l'application lorsqu'elle est en cours d'exécution. Cela ne fait qu'ajouter au mystère. –

+0

Pas vraiment - c'est parce que le DataContext du TextBlock est nul - d'où la liaison est 'dormant' jusqu'à ce qu'un DataContext soit défini. – Goblin

Répondre

3

Voir Karl Shifflett pour l'explication complète de la façon d'hériter du DataContext du contrôle « posséder » de l'info-bulle: http://karlshifflett.wordpress.com/2007/12/29/wpf-sample-series-data-binding-in-tooltip/

Il est pas tout à fait des choses Textbook :)

+0

Désolé pour le long et long délai pour essayer cela. Après tout, le projet s'est retrouvé au bas de ma liste. Quoi qu'il en soit, après avoir lu l'article, c'est exactement ce que je cherchais. J'ai mis à jour mes questions avec le code de travail. Merci! –

+0

Pas de soucis - content de pouvoir aider :-) – Goblin

0

Essayez d'utiliser x:Name sur le contrôle avec l'info-bulle, puis <Binding ElementName="yourName" Path="Tag"> pour la liaison.

+0

Malheureusement, j'ai déjà essayé cette approche, pas de dés. –

+0

Pourquoi pas? Quelle erreur de liaison avez-vous eu lorsque vous l'avez essayé? –

2

Le problème est que les info-bulles sont des fenêtres contextuelles qui se trouvent en dehors de l'arborescence visuelle principale, ce qui provoque la rupture de RelativeSource et de ElementName lors de la recherche d'éléments en dehors de l'info-bulle. Le moyen le plus simple de contourner ce problème consiste à utiliser le DataContext hérité pour vos liaisons, tel qu'il est transmis à l'info-bulle, mais cela ne donne pas toujours accès à ce dont vous avez besoin.

Une alternative consiste à utiliser une propriété attachée personnalisée déclarée avec FrameworkMetadataOptions.Inherits. Vous pouvez ensuite définir une valeur pour cette propriété sur l'objet propriétaire (TextBox dans ce cas), puis accéder à la valeur héritée sur n'importe quel élément à l'intérieur de l'info-bulle. Dans ce cas, vous devez définir la valeur de la propriété attachée au lieu de la balise.

+0

Je comprends à propos de l'info-bulle existant en dehors de l'arbre visuel principal, etc., mais le premier bloc de XAML fonctionne réellement donc il semble qu'il y ait un moyen d'obtenir la propriété tag dans l'info-bulle elle-même. Pourquoi est-ce accessible dans le premier cas, mais pas dans le second? –

+1

Le premier bloc ne se trouve pas dans l'info-bulle. Il définit une propriété sur TextBox, comme si vous l'avez fait

+0

Oh, je vois, je suppose que c'est une illusion d'optique de la structure de la XAML. duh. Je suppose que je vais regarder dans votre première suggestion alors. –