2012-08-02 110 views
2

我有一個TreeView,它被修改爲在文本前面顯示圖像。所以我修改後的TreeViewItem被稱爲ImagedTreeViewItem。 此ImagedTreeViewItem有一個屬性,其中包含要顯示的圖像控件的圖像。 ImagedTreeViewItem還有一個屬性,用於檢查ImagedTreeViewItem-Icon是否爲文件夾圖標。該屬性的名稱是「IsFolder」。綁定一個祖先不工作WPF

我的問題是: I'm Binding the Ancestors-Property (here: The ImagedTreeViewItem)以獲取我需要的數據。對於我的圖像控制它完美的作品,我後來沒有添加的上下文菜單。 我不明白爲什麼,因爲基本上它是相同的命令。

這裏是我的「ImagedTreeView」的XAML代碼:

<TreeView.Resources> 
       <Style TargetType="{x:Type myClasses:ImagedTreeViewItem}"> 
        <Setter Property="HeaderedItemsControl.HeaderTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <StackPanel Orientation="Horizontal"> 
<!-- Here it works!!! --> 
            <Image Height="16" Source="{Binding Path=Icon, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type myClasses:ImagedTreeViewItem}}}" Stretch="Fill" Width="16" /> 
            <TextBlock Margin="5,0" Text="{Binding}" /> 
            <StackPanel.ContextMenu> 
             <ContextMenu> 
<!-- Here not :(--> 
              <MenuItem Command="my:ImagedTreeView.AddFolder" Header="Add Folder" 
                   IsEnabled="{Binding Path=IsFolder, 
                   RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type myClasses:ImagedTreeViewItem}}}"> 
               <MenuItem.Icon> 
                <Image Source="folderadd16.png" /> 
               </MenuItem.Icon> 
              </MenuItem> 
              <!-- ... --> 
             </ContextMenu> 
            </StackPanel.ContextMenu> 
           </StackPanel> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </TreeView.Resources> 

我想在這個代碼的第二結合找不到祖先。 Visual Studio中的輸出窗口告訴我同樣的:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='....ImagedTreeViewItem', AncestorLevel='1''. BindingExpression:Path=IsFolder; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'IsEnabled' (type 'Boolean') 

回答

4

ContextMenu不是的VisualTree的一部分,這就是爲什麼綁定失敗。您必須使用某種中繼:ContextMenu.PlacementTargetTag屬性作爲第二次綁定搜索的緩存。我認爲這將工作:

<StackPanel Orientation="Horizontal" 
      Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type myClasses:ImagedTreeViewItem}}}"> 
    <StackPanel.ContextMenu> 
     <ContextMenu> 
      <MenuItem Command="my:ImagedTreeView.AddFolder" Header="Add Folder" 
         IsEnabled="{Binding Path=PlacementTarget.Tag.IsFolder, RelativeSource={RelativeSource AncestorType=ContextMenu}}"> 
       <MenuItem.Icon> 
        <Image Source="folderadd16.png" /> 
       </MenuItem.Icon> 
      </MenuItem> 
      <!-- ... --> 
     </ContextMenu> 
    </StackPanel.ContextMenu> 
+0

這樣的作品,謝謝! – Hunv 2012-08-04 11:57:29