【问题标题】:Binding an Ancestor not working WPF绑定祖先不工作的WPF
【发布时间】:2012-07-31 15:36:06
【问题描述】:

我有一个 TreeView,它也被修改为在文本前面显示图像。所以我修改后的 TreeViewItem 被称为 ImagedTreeViewItem。 此 ImagedTreeViewItem 有一个属性,其中包含要显示的 Image-Control 的图像。 ImagedTreeViewItem 还有一个属性,用于检查 ImagedTreeViewItem-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')

【问题讨论】:

    标签: wpf binding ancestor


    【解决方案1】:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 2019-06-09
      • 1970-01-01
      • 2012-04-28
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      相关资源
      最近更新 更多