2010-11-03 117 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> 

順便說一句,在ListView中使用DataTemplate。 「說明」屬性存在於綁定到列表視圖的視圖模型上。

我在VS2010輸出窗口獲得的消息是:

System.Windows.Data錯誤:39:BindingExpression路徑錯誤:對「對象」「」字符串」未找到「說明」屬性(的HashCode = -466763399)」。 BindingExpression:路徑= 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}}}"> 

綁定到標籤。是的黑客,但它的工作。

​​

乾杯

邁克

回答

5

工具提示不應該需要一個的RelativeSource綁定。沒有數據上下文結合

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

這是假設的標籤類型,這DataTemplate中是基於有一個名爲Description屬性試試這個。您可能需要綁定到PlacementTarget的少數情況之一是在某些情況下使用ContextMenu控件。

+0

說明來自與此視圖關聯的ViewModel。 – ozczecho 2010-11-08 05:13:37

+0

基於Viewmodel的數據素材?或其他一些類 – TerrorAustralis 2010-11-08 05:28:56

0

如果這個DataTemplate是ListView的ItemTemplate,就像你聲明的那樣,那麼你不需要在ToolTip上設置DataContext,也不需要在Label.Content綁定中設置RelativeSource BindingExpression。 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

不是它不是ItemTemplate的DataTemplate。它是列表視圖中列的DataTemplate。 DataTemplate被定義爲資源中的樣式。 – ozczecho 2010-11-08 05:12:35

1

我還與工具提示綁定問題,因爲提示被定義爲一個資源。我通過爲ToolTipOpening事件創建事件處理程序來解決問題。在處理函數中,您可以訪問顯示的UI元素的DataContext並設置Tooltip的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

Tooltip是一個彈出窗口。有時它需要顯示在主窗口邊界的一側。所以工具提示不能在你的主要視覺樹中。如果你看看它的可視樹層次結構,你會發現這個彈出框有它自己的可視樹根。這就是爲什麼too​​ltip不能自動識別列表項的DataContext。現在問題變成了如何將DataContext傳播到工具提示的可視化樹。您在UPDATE中演示的方式是這樣做的一種方式...