2009-09-14 41 views
2

我想创建一个列表框的上下文菜单,该列表框显示列表框中上下文菜单中的元素。我可以通过使用以下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}}" > 
+0

@Pawel。很高兴你对此进行整理。回答自己的问题时的标准方法是实际添加解决方案作为答案。几天后,你可以接受你自己的答案,这有助于表明这个问题已经解决。 – 2009-09-15 13:28:30

+0

@德鲁,感谢您的提示。这是我的第一篇文章。现在会这样做。 – Pavel 2009-09-15 18:39:25

回答

1

找到了答案,我只需要绑定到PlacementTarget.Items并使用自己的相对源代替使用查找祖先相对源。

<ContextMenu x:Key="contextMenu" 
    ItemsSource="{Binding PlacementTarget.Items, 
    RelativeSource={RelativeSource Self}}" > 
0

我认为你在这里遇到的问题是由于上下文菜单是不同视觉树的一部分。也就是说,您无法找到ListBox祖先,因为它实际上并不是上下文菜单的祖先。

如果您查看Visual Studio的调试面板,您应该看到有关失败的绑定表达式的一些警告。你做?

+0

没有失败的绑定警告。 – Pavel 2009-09-15 13:06:29