无法使用 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 ContextMenu
与 ListBox
不属于同一可视化树,因此 RelativeSource
绑定不起作用。您可以这样做:
<MenuItem Header="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}">
这有效,因为 ContextMenu
的 PlacementTarget
是父 ListBox
。
我有一个带有上下文菜单的列表框,我正在尝试绑定到标签。
我可以使用 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 ContextMenu
与 ListBox
不属于同一可视化树,因此 RelativeSource
绑定不起作用。您可以这样做:
<MenuItem Header="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}">
这有效,因为 ContextMenu
的 PlacementTarget
是父 ListBox
。