2012-08-02 91 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