绑定不工作的WPF的祖先

绑定不工作的WPF的祖先,wpf,binding,ancestor,Wpf,Binding,Ancestor,我有一个树状视图,它被修改为在文本前面显示图像。因此,我修改的TreeViewItem称为ImagedTreeViewItem。 此ImagedTreeViewItem具有一个属性,该属性包含图像控件要显示的图像。 ImagedTreeViewItem还有一个属性,用于检查ImagedTreeViewItem图标是否为文件夹图标。此属性的名称为“IsFolder” 我的问题是: 我正在绑定祖先属性(此处:ImagedTreeViewItem)以获取所需的数据。对于我的图像控件来说,它工作得非常好

我有一个树状视图,它被修改为在文本前面显示图像。因此,我修改的TreeViewItem称为ImagedTreeViewItem。 此ImagedTreeViewItem具有一个属性,该属性包含图像控件要显示的图像。 ImagedTreeViewItem还有一个属性,用于检查ImagedTreeViewItem图标是否为文件夹图标。此属性的名称为“IsFolder”

我的问题是:
我正在绑定祖先属性(此处:ImagedTreeViewItem)
以获取所需的数据。对于我的图像控件来说,它工作得非常好,对于我后来添加的上下文菜单来说,它就不是了。 我不明白为什么,因为基本上是同一个命令

以下是我的“ImagedTreeView”在XAML中的代码:


ContextMenu
不是VisualTree的一部分,这就是绑定失败的原因。您必须使用某种中继:
ContextMenu.PlacementTarget
Tag
属性作为绑定搜索第二个跟踪的缓存。我认为这会奏效:

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

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')
<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>