Привязка контекстного меню к коллекции элементов ListBox - PullRequest
2 голосов
/ 15 сентября 2009

Я пытаюсь создать контекстное меню для списка, который отображает элементы в контекстном меню из списка. Я могу сделать это, используя следующий 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}}" >

Ответы [ 2 ]

1 голос
/ 15 сентября 2009

Нашел ответ, мне просто нужно привязать к PlacementTarget.Items и использовать собственный относительный источник вместо того, чтобы использовать относительный источник поиска предка.

<ContextMenu x:Key="contextMenu" 
  ItemsSource="{Binding PlacementTarget.Items, 
  RelativeSource={RelativeSource Self}}" >
0 голосов
/ 15 сентября 2009

Я думаю, что проблема, с которой вы здесь столкнулись, связана с тем, что контекстное меню является частью другого визуального дерева. То есть вы не можете найти предка ListBox, потому что он на самом деле не является предком контекстного меню.

Если вы посмотрите на панель отладки Visual Studio, вы должны увидеть некоторые предупреждения о неудачном выражении привязки. А ты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...