Pregunta

Estoy tratando de crear un menú contextual para un cuadro de lista que muestre elementos en el menú contextual desde el cuadro de lista. Puedo lograr esto usando el siguiente 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>

Esto funciona muy bien para un cuadro de lista. Sin embargo, cuando tengo un segundo cuadro de lista, el menú contextual sigue mostrando los elementos del primer cuadro de lista. En otras palabras, el ItemSource del menú contextual no cambia. Solo la primera vez que se abre el menú contextual es el conjunto de propiedades ItemsSource. Por ejemplo:

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

Me gustaría establecer el menú contextual en un Estilo porque tengo muchas instancias de un cuadro de lista y no quiero definir un menú de contexto separado para cada cuadro de lista.

ACTUALIZACIÓN: Finalmente descubrí cómo solucionarlo. Solo necesito vincularme a PlacementTarget.Items y usar una fuente auto-relativa en lugar de usar una fuente relativa de encontrar ancestro.

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

Solución

Encontré la respuesta, solo necesito vincularme a PlacementTarget.Items y usar una fuente auto-relativa en lugar de usar una fuente relativa de encontrar ancestro.

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

Otros consejos

Creo que el problema que tienes aquí se debe al hecho de que el menú contextual es parte de un árbol visual diferente. Es decir, no puede encontrar el ancestro ListBox porque en realidad no es un ancestro del menú contextual.

Si observa el panel de depuración de Visual Studio, debería ver algunas advertencias sobre la expresión de enlace errónea. ¿Tú?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top