Pergunta

Eu estou tentando criar um menu de contexto para uma caixa de listagem que exibe elementos no menu de contexto da caixa de listagem. Eu sou capaz de fazer isso usando o seguinte 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>

Isso funciona muito bem para uma caixa de listagem. No entanto, quando eu tenho uma segunda caixa lista, o menu de contexto continua a mostrar os elementos de primeira caixa de lista. Em outras palavras, o ItemsSource do menu de contexto não muda. Apenas a primeira vez que o menu de contexto é aberto é a propriedade ItemsSource set. Por exemplo:

<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>

Gostaria de definir o menu de contexto em um estilo porque eu tenho muitos exemplos de uma caixa de listagem e não quero definir um menu de contexto separado para cada caixa de listagem.

UPDATE: Eu finalmente descobri como corrigi-lo. Eu só preciso para se ligar ao PlacementTarget.Items e usando uma fonte de auto relativa em vez de usar um achado ancestral fonte relativa.

<ContextMenu x:Key="contextMenu" 
  ItemsSource="{Binding PlacementTarget.Items, 
  RelativeSource={RelativeSource Self}}" >
Foi útil?

Solução

Encontrou a resposta, eu só preciso para se ligar ao PlacementTarget.Items e usando uma fonte de auto relativa em vez de usar um achado ancestral fonte relativa.

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

Outras dicas

Eu acho que o problema que você está tendo aqui é devido ao fato de que o menu de contexto é parte de uma árvore visual diferente. Ou seja, você não consegue encontrar o ancestral ListBox porque não é realmente um ancestral do menu de contexto.

Se você olhar para o painel de depuração do Visual Studio, você deve ver alguns avisos sobre a expressão de ligação falhar. Você?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top