2009-06-08 6 views
3

J'utilise DataTemplates pour rendre des éléments dans ItemsControl. Je veux montrer une info-bulle pour chaque article. Si j'utilise une liaison telle que ToolTip = "{Binding MyToolTip, Mode = OneWay}", WPF obtient l'info-bulle une fois au début et ne met pas à jour l'info-bulle quand il est ouvert.WPF DataTemplate: Comment créer une info-bulle juste à temps?

Mes éléments implémentent INotifyPropertyChanged, donc en principe je pourrais générer des notifications de modification pour MyToolTip. Le problème est que l'info-bulle est produite à partir de nombreuses informations dans le modèle sous-jacent. Ces informations changent fréquemment et il serait à la fois lourd et inefficace de générer des notifications de modification pour la propriété MyToolTip. De plus, je ne veux pas que les info-bulles pour TOUS les articles soient produites au départ. Au lieu de cela, je voudrais forcer une nouvelle info-bulle à générer lorsque l'info-bulle est ouverte. Comment puis-je le faire?

Répondre

4

Vous devrez utiliser un peu de code-behind, mais ce n'est pas si grave.

<object ToolTip="{Binding MyToolTip, Mode=OneWay}" ToolTipOpening="MyToolTip_Opening" /> 

Dans le code-behind

private void MyToolTip_Opening(object sender, ToolTipEventArgs e) 
{ 
    DependencyObject depObj = sender as DependencyObject; 
    if (depObj == null) return; 
    BindingExpression be = BindingOperations.GetBindingExpression(depObj, FrameworkElement.ToolTipProperty); 
    if (be != null) be.UpdateTarget(); 
} 
+0

Je suppose que quelque part avant d'appeler la mise à jour sur le BindingExpression, vous souhaitez mettre à jour le texte info-bulle? – micahtan

+0

Il a dit qu'il serait fastidieux de générer des notifications de changement, mais je suppose que je supposais toujours que la propriété MyToolTip était toujours la bonne façon d'obtenir l'info-bulle. L'appel de BindingExpression.UpdateTarget() requerra cette propriété pour sa valeur. –

+1

À ce stade, je pense que vous pourriez probablement ajouter UpdateSourceTrigger = Explicit à l'expression de liaison, et enregistrer le surcoût de remplissage de l'info-bulle lorsque le contrôle est d'abord rempli. –

Questions connexes