我想创建一个列表框的上下文菜单,该列表框显示列表框中上下文菜单中的元素。我可以通过使用以下XAML来完成此操作:将上下文菜单绑定到ListBox的Items集合
<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>
我想设置的上下文菜单的风格,因为我有一个列表框的许多情况下,不希望定义每个列表框一个单独的上下文菜单。
更新: 我终于想出了如何解决它。我只需要绑定到PlacementTarget.Items并使用自己的相对源代替使用查找祖先相对源。
<ContextMenu x:Key="contextMenu"
ItemsSource="{Binding PlacementTarget.Items,
RelativeSource={RelativeSource Self}}" >
@Pawel。很高兴你对此进行整理。回答自己的问题时的标准方法是实际添加解决方案作为答案。几天后,你可以接受你自己的答案,这有助于表明这个问题已经解决。 – 2009-09-15 13:28:30
@德鲁,感谢您的提示。这是我的第一篇文章。现在会这样做。 – Pavel 2009-09-15 18:39:25