我正在尝试为列表框创建上下文菜单,该列表框从列表框中显示上下文菜单中的元素。我可以使用以下XAML来完成此任务:
<Window.Resources>
<ContextMenu x:Key="contextMenu"
ItemsSource="{Binding Items,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" >
<ContextMenu.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Content}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
<Style TargetType="{x:Type ListBox}">
<Setter Property="ContextMenu" Value="{StaticResource contextMenu}"/>
</Style>
</Window.Resources>
这适用于一个列表框。但是,当我有第二个列表框时,上下文菜单将继续显示第一个列表框中的元素。换句话说,上下文菜单的ItemsSource不会更改。只有第一次打开上下文菜单才是ItemsSource属性集。例如:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox x:Name="first" >
<ListBoxItem>First 1</ListBoxItem>
<ListBoxItem>First 2</ListBoxItem>
<ListBoxItem>First 3</ListBoxItem>
<ListBoxItem>First 4</ListBoxItem>
<ListBoxItem>First 5</ListBoxItem>
</ListBox>
<ListBox x:Name="second" Grid.Column="2" >
<ListBoxItem>Second 1</ListBoxItem>
<ListBoxItem>Second 2</ListBoxItem>
<ListBoxItem>Second 3</ListBoxItem>
<ListBoxItem>Second 4</ListBoxItem>
<ListBoxItem>Second 5</ListBoxItem>
</ListBox>
</Grid>
我想在Style中设置上下文菜单,因为我有很多列表框实例,并且不想为每个列表框定义单独的上下文菜单。
更新 我终于找到了解决方法。我只需要绑定到PlacementTarget.Items并使用自相关源而不是使用find ancestor相对源。
<ContextMenu x:Key="contextMenu"
ItemsSource="{Binding PlacementTarget.Items,
RelativeSource={RelativeSource Self}}" >
答案 0 :(得分:1)
找到答案,我只需要绑定到PlacementTarget.Items并使用自相关源而不是使用find ancestor relative source。
<ContextMenu x:Key="contextMenu"
ItemsSource="{Binding PlacementTarget.Items,
RelativeSource={RelativeSource Self}}" >
答案 1 :(得分:0)
我认为你在这里遇到的问题是由于上下文菜单是不同视觉树的一部分。也就是说,你找不到ListBox的祖先,因为它实际上并不是上下文菜单的祖先。
如果查看Visual Studio的调试面板,您应该会看到有关失败绑定表达式的一些警告。你呢?