绑定祖先在WPF中无法工作

3
我有一个TreeView,它被修改以在文本前面显示图像。因此,我的修改后的TreeViewItem称为ImagedTreeViewItem。 这个ImagedTreeViewItem有一个属性,它包含了Image-Control要显示的图像。 ImagedTreeViewItem还有一个属性,它检查ImagedTreeViewItem-Icon是否是文件夹图标。这个属性的名称是“IsFolder”。
我的问题是: 我绑定了祖先属性(这里是ImagedTreeViewItem)来获取我需要的数据。对于我的Image-Control,它完美地工作,但对于我后来添加的上下文菜单却不行。 我不明白为什么,因为基本上它是相同的命令。
这是我的“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')
1个回答

6

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接