Я пытаюсь создать контекстное меню для списка, который отображает элементы в контекстном меню из списка. Я могу сделать это, используя следующий 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>
Я хотел бы установить контекстное меню в стиле, потому что у меня много экземпляров списка и я не хочу определять отдельное контекстное меню для каждого списка.
UPDATE:
Я наконец понял, как это исправить. Мне просто нужно привязать к PlacementTarget.Items и использовать собственный относительный источник вместо того, чтобы использовать относительный источник поиска предка.
<ContextMenu x:Key="contextMenu"
ItemsSource="{Binding PlacementTarget.Items,
RelativeSource={RelativeSource Self}}" >