Подтвердить что ты не робот

WPF привязка к подсказке

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

                    <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= ''); target является "Text" (тип "String" )

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

У меня также были проблемы с привязками в подсказке, так как всплывающая подсказка была определена как ресурс. Я решил проблему, создав обработчик событий для события 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;
    }

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

Ответ 4

Если этот 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>