Это сложно, потому что ToolTip не является частью VisualTree. Здесь вы видите классное решение той же проблемы с ContextMenus. Точно так же, как вы можете использовать всплывающую подсказку.
UPDATE
К сожалению, ссылка исчезла, и я больше не нашел ссылочную статью.
Насколько я помню, упомянутый блог показал, как привязать к DataContext другого VisualTree, что часто бывает необходимо при привязке из всплывающей подсказки, ContextMenu или Popup.
Хороший способ сделать это - предоставить нужный экземпляр (например, ViewModel) в свойстве Tag свойства PlacementTarget. В следующем примере это делается для доступа к экземпляру Command модели ViewModel:
<Button Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=Self}}">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding PlacementTarget.Tag.DesiredCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" .../>
<ContextMenu>
</Button.ContextMenu>
</Button>
Я не проверял это, и долгое время я делал это в последний раз. Пожалуйста, оставьте комментарий, если он не работает для вас.
ОБНОВЛЕНИЕ 2
Поскольку исходная ссылка, о которой был написан этот ответ, исчезла, я нажал на archive.org и нашла оригинальную запись в блоге . Вот оно, дословно из блога:
Поскольку ContextMenu в WPF не существует в визуальном дереве
Ваша страница / окно / элемент управления как таковой, привязка данных может быть немного сложнее.
Я искал высоко и низко по сети для этого, и наиболее
общий ответ кажется «просто сделайте это в коде позади». НЕПРАВИЛЬНО! я
не пришел в чудесный мир XAML, чтобы вернуться
делать вещи в коде позади.
Вот мой пример того, что позволит вам связать строку, которая
существует как свойство вашего окна.
public partial class Window1 : Window
{
public Window1()
{
MyString = "Here is my string";
}
public string MyString
{
get;
set;
}
}
<Button Content="Test Button"
Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}">
<Button.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag,
RelativeSource={RelativeSource Self}}" >
<MenuItem Header="{Binding MyString}"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
Важной частью является тег на кнопке (хотя вы могли бы просто
легко установить DataContext кнопки). Это хранит ссылку на
родительское окно. ContextMenu может получить доступ к этому
через свойство PlacementTarget. Затем вы можете передать этот контекст
вниз через ваши пункты меню.
Я признаю, что это не самое элегантное решение в мире.
Тем не менее, это лучше, чем установка кода в коде. Если у кого есть
еще лучший способ сделать это, я хотел бы услышать это.