我有一个TreeView,它被修改为在文本前面显示图像。所以我修改后的TreeViewItem被称为ImagedTreeViewItem。 此ImagedTreeViewItem有一个Property,其中包含要显示的Image-Control图像。 ImagedTreeViewItem还有一个属性,用于检查ImagedTreeViewItem-Icon是否为文件夹-Icon。此属性的名称为“IsFolder”。
我的问题是:
I'm Binding the Ancestors-Property (here: The ImagedTreeViewItem)
获取我需要的数据。对于我的Image-Control,它完美地工作,对于我后来添加的上下文菜单没有。
我不明白为什么,因为基本上它是相同的命令。
以下是XAML中我的“ImagedTreeView”的代码:
<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')
答案 0 :(得分:5)
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>