Привязка WPF к всплывающей подсказке - PullRequest
13 голосов
/ 03 ноября 2010

Не уверен, что здесь происходит, но привязка работает для метки в шаблоне данных, но не для всплывающей подсказки. Любая помощь будет оценена.

                    <DataTemplate DataType="Label">
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                        <StackPanel.ToolTip>
                            <ToolTip DataContext="{Binding Path=PlacementTarget,
       RelativeSource={x:Static RelativeSource.Self}}">
                                <TextBlock Text="{Binding Path=DataContext.Description}" />
                            </ToolTip>
                        </StackPanel.ToolTip>
                        <Image Source="{StaticResource ApplicationInfoS}" 
                               Margin="0 0 5 0" Stretch="None"
                               HorizontalAlignment="Left" />
                        <Label Style="{StaticResource lblTextContent}" 
                               Padding="5 0 0 0"
                               Content="{Binding Path=DataContext.Description, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"/>
                    </StackPanel>
                </DataTemplate>

Кстати, DataTemplate используется в Listview. Свойство «Описание» существует в модели представления, связанной с представлением списка.

Сообщение, которое я получаю в окне вывода в VS2010:

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: свойство 'Description' не найдено в 'object' '' String '(HashCode = -466763399)'. BindingExpression: Path = DataContext.Description; DataItem = 'StackPanel' (Name = ''); целевым элементом является TextBlock (Name = ''); Целевым свойством является «Текст» (тип «Строка»)

UPDATE

Я сдался на данный момент. Использование следующего хака на данный момент:

Добавить тег в StackPanel и привязать к нему «Описание»

    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Tag="{Binding Path=DataContext.Description, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}">

Свяжите всплывающую подсказку с тегом. Да взломать, но это работает.

<StackPanel.ToolTip>
  <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
    <TextBlock Text="{Binding Path=Tag}" />
  </ToolTip>
</StackPanel.ToolTip>

Приветствия

Mike

Ответы [ 4 ]

4 голосов
/ 03 ноября 2010

Подсказка не должна привязываться к родственному источнику. Попробуйте это без привязки контекста данных

<StackPanel.ToolTip>
    <ToolTip Content={Binding Description} />
<StackPanel.ToolTip>

Предполагается, что тип метки, на котором основан этот шаблон данных, имеет свойство с именем Description. Один из немногих случаев, когда вам может понадобиться привязаться к PlacementTarget, в некоторых случаях - с элементом управления ContextMenu.

2 голосов
/ 12 января 2014

Всплывающая подсказка. Иногда это должно отображаться за пределами границ вашего основного окна. Так что всплывающая подсказка не может быть в вашем основном визуальном дереве. Если вы посмотрите на иерархию визуального дерева, вы обнаружите, что у всплывающего окна есть собственный корень визуального дерева. Вот почему всплывающая подсказка не знает о DataContext элемента списка автоматически. Теперь возникает вопрос, как распространять DataContext в визуальное дерево всплывающей подсказки. То, как вы продемонстрировали в своем ОБНОВЛЕНИИ, является одним из способов сделать это ...

1 голос
/ 05 августа 2012

У меня также были проблемы с привязками в подсказке, так как подсказка была определена как ресурс.Я решил проблему, создав обработчик события для события ToolTipOpening.В функции обработчика вы можете получить доступ к DataContext отображаемого элемента пользовательского интерфейса и установить DataContext из всплывающей подсказки.

Это был мой XAML:

<StackPanel ToolTip=" " ToolTipOpening="Item_ToolTipOpening" >

, и это был мой обработчик кода:

void Item_ToolTipOpening(object sender, ToolTipEventArgs e)
    {
        if (sender as FrameworkElement == null)
            return;
        ToolTip tooltip = (ToolTip) FindResource("MailItemToolTip");
        if ((sender as FrameworkElement).DataContext is LinkItem)
            tooltip.DataContext = ((sender as FrameworkElement).DataContext as LinkItem).ParentItem as MailItem;
        else if ((sender as FrameworkElement).DataContext is AttachmentItem)
            tooltip.DataContext = ((sender as FrameworkElement).DataContext as AttachmentItem).ParentItem as MailItem;
        (sender as FrameworkElement).ToolTip = tooltip;
    }

Обратите внимание, что подсказка должна быть установлена ​​(по крайней мере, на какое-то значение), в противном случае событие ToolTipOpening не вызывается.

0 голосов
/ 03 ноября 2010

Если этот DataTemplate является ItemTemplate для ListView, как вы заявляете, то вам не нужно устанавливать DataContext для ToolTip и не иметь RelativeSource BindingExpression в привязке Label.Content.DataContext уже должен быть установлен ListView.Вот почему мы используем DataTemplate.

Попробуйте просто обычную привязку для каждого:

<DataTemplate>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
        <StackPanel.ToolTip>
            <ToolTip>
                <TextBlock Text="{Binding Path=Description}" />
            </ToolTip>
        </StackPanel.ToolTip>
        <Image Source="{StaticResource ApplicationInfoS}" 
               Margin="0,0,5,0"
               Stretch="None"
               HorizontalAlignment="Left" />
        <Label Style="{StaticResource lblTextContent}" 
               Padding="5,0,0,0"
               Content="{Binding Path=Description}" />
    </StackPanel>
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...