无法使用 FindAncestor 通过 ContextMenu 绑定到父属性

Unable to use FindAncestor to bind to parent properties with a ContextMenu

我有一个带有上下文菜单的列表框,我正在尝试绑定到标签。 我可以使用 RelativeSource/FindAncestor 从 ItemTemplate 绑定到 Tag 但同样的方法不适用于 ContextMenu.

我查看了 Visual Studio 中的实时可视化树,看到了列表框项,但没有看到上下文菜单。如果 ListBox 不是可视化树中 ContextMenu 的祖先,执行此绑定的正确方法是什么?

注意: 我打算在 Page.Resources 中创建一个上下文菜单,我可以在多个 ListBox 中使用它,所以我不想使用 ElementName 绑定到特定控件。

<ListBox Grid.Row="1"
         x:Name="SetupStepsList"
         VerticalAlignment="Stretch"
         KeyDown="ListBox_KeyDown"
         Tag="This is the tag"
         Style="{StaticResource GenericListBox}"
         SelectedValue="{Binding ActiveStep, Mode=TwoWay}"
         ItemContainerStyle="{StaticResource TightListBox}"
         ItemsSource="{Binding SelectedStation.SetupSteps, Mode=OneWay}">

   <ListBox.ContextMenu>
      <ContextMenu>
         <MenuItem Header="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=Tag}" >
            <MenuItem.Icon>
               <iconPacks:PackIconMaterial Kind="Plus"
                                           Style="{StaticResource MenuIconStyle}"/>
            </MenuItem.Icon>
         </MenuItem>
      </ContextMenu>
   </ListBox.ContextMenu>

   <ListBox.ItemTemplate>
      <DataTemplate>
         <StackPanel>
            <TextBlock AllowDrop="False"
                       Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=Tag}"/>
         </StackPanel>
      </DataTemplate>
   </ListBox.ItemTemplate>

</ListBox>

A ContextMenuListBox 不属于同一可视化树,因此 RelativeSource 绑定不起作用。您可以这样做:

<MenuItem Header="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}">

这有效,因为 ContextMenuPlacementTarget 是父 ListBox