2010-11-03 17 views
12

Nicht sicher, was hier geschieht, aber die Bindung funktioniert für das Label in der Datenvorlage, aber nicht die QuickInfo. Jede Hilfe wird geschätzt.WPF-Bindung an Tooltip

    <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 das DataTemplate wird in Listview verwendet. Die Eigenschaft "Beschreibung" existiert im Ansichtsmodell, das an die Listenansicht gebunden ist.

in VS2010 ist die Botschaft, die ich im Ausgabefenster erhalten:

System.Windows.Data Fehler: 39: Bindingpfadfehler: 'Beschreibung' Eigenschaft nicht auf 'Objekt' '' String‘gefunden (HashCode = -466763399) '. BindingExpression: Pfad = DataContext.Description; DataItem = 'StackPanel' (Name = ''); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String')

UPDATE

Ich habe jetzt aufgegeben. Mit dem folgenden Hack einstweilen:

einen Tag hinzufügen, um die Stackpanel und Bind „Beschreibung“, um es

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

Bind die Quick-Info an den Tag. Ja ein Hack, aber es funktioniert.

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

Prost

Mike

Antwort

5

Tooltip eine Relative Bindung nicht benötigen sollte. Versuchen Sie, diese ohne Datenkontext Bindung

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

Dies wird unter der Annahme, dass der Etikettentyp, dass diese auf Datatemplate basiert eine Eigenschaft namens Beschreibung. Eine der wenigen Instanzen, in denen Sie möglicherweise eine Bindung mit dem PlacementTarget herstellen müssen, ist in einigen Fällen ein ContextMenu-Steuerelement.

+0

Die Beschreibung stammt vom ViewModel, das dieser Ansicht zugeordnet ist. – ozczecho

+0

Basiert die Datamaplatte auf dem Viewmodel? oder eine andere Klasse – TerrorAustralis

0

Wenn diese DataTemplate die ItemTemplate für einen ListView ist, wie Sie es angeben, müssen Sie weder den DataContext auf der QuickInfo setzen noch eine RelativeSource BindingExpression in Ihrer Label.Content-Bindung haben. Der DataContext sollte bereits von der ListView gesetzt sein. Deshalb verwenden wir das DataTemplate.

Versuchen nur eine ganz normale für jede Bindung:

<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

Nein, es ist nicht die DataTemplate für ItemTemplate. Es ist ein DataTemplate für eine Spalte in einer Listview. Das DataTemplate ist als Stil in einer Ressource definiert. – ozczecho

1

Ich hatte auch Probleme mit Bindung im Tooltip, da der Tooltip als Ressource definiert wurde. Ich habe das Problem gelöst, indem ich einen Ereignishandler für das ToolTipOpening-Ereignis erstellt habe. In der Handler-Funktion können Sie dann auf den DataContext des angezeigten UI-Elements zugreifen und den DataContext des Tooltips setzen.

Das war mein XAML:

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

und dieser Handler mein Code war:

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; 
    } 

Beachten Sie, dass die Quick-Info (zumindest bis zu einem gewissen Wert) eingestellt werden muss, da sonst die ToolTipOpening Veranstaltung wird nicht aufgerufen.

2

Tooltip ist ein Popup.Manchmal muss es außerhalb der Hauptfenstergrenzen angezeigt werden. Der Tooltip kann also nicht in deinem Hauptbaum sein. Wenn Sie sich die visuelle Baumhierarchie ansehen, werden Sie feststellen, dass das Popup sein eigenes visuelles Baumstammverzeichnis hat. Daher kennt Tooltip den DataContext des Listenelements nicht automatisch. Jetzt stellt sich die Frage, wie der DataContext in den visuellen Tree von Tooltip übernommen wird. Die Art und Weise, wie Sie in Ihrem UPDATE demonstriert haben, ist eine Möglichkeit, dies zu tun ...