2010-11-03 2 views
12

Не уверен, что здесь делает, но привязка работает для метки в шаблоне данных, но не в подсказке. Любая помощь будет оценена.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> 

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

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

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

UPDATE

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

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

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

Bind всплывающей подсказки к Tag. Да, взлом, но он работает.

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

Приветствия

Майк

ответ

5

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

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

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

+0

Описание происходит из ViewModel, связанного с этим представлением. – ozczecho

+0

Является ли datatemplate основанной на Viewmodel? или какой-либо другой класс – TerrorAustralis

0

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

Нет его не DataTemplate для ItemTemplate. Его DataTemplate для столбца в Listview. DataTemplate определяется как стиль в ресурсе. – ozczecho

1

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

2

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

Смежные вопросы