2012-06-18 30 views
7

Tengo un ListView que muestra una lista de valores de cadena. Quiero agregar una entrada del menú contextual para cada elemento en la lista para eliminar el elemento seleccionado. Mi XAML se ve así:menú contextual para eliminar elementos en listview

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}"> 
    <ListView.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="Remove" 
       Command="{Binding RemoveItem}" 
       CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}" /> 
    </ContextMenu> 
    </ListView.ContextMenu> 
</ListView> 

El problema es que el valor CommandParameter siempre es nula. He agregado un botón adicional para eliminar el elemento seleccionado y comprobar si funciona mi comando. El botón tiene exactamente el mismo enlace y la eliminación de elementos a través del botón funciona. El botón tiene el siguiente aspecto:

<Button Content="Remove selected item" 
     Command="{Binding RemoveItem}" 
     CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}"/> 

El comando es el siguiente:

private ICommand _removeItem; 

public ICommand RemoveItem 
{ 
    get { return _removeItem ?? (_removeItem = new RelayCommand(p => RemoveItemCommand((string)p))); } 
} 

private void RemoveItemCommand(string item) 
{ 
    if(!string.IsNullOrEmpty(item)) 
    MyItems.Remove(item); 

} 

Cualquier idea por qué el elemento seleccionado es nulo cuando se abre el menú contextual? Tal vez un problema de enfoque de la lista?

+0

Tenga una mirada en la ventana de salida, seguro que encontrará un mensaje de error vinculante. Como ContextMenu es una nueva ventana, no estoy seguro de que pueda acceder a itemsListView. –

+0

Eche un vistazo a http://stackoverflow.com/questions/1013558/elementname-binding-from-menuitem-in-contextmenu y http://stackoverflow.com/questions/2617122/wpf-menuitem-command-binding-to -elementname-results-to-system-windows-data-error –

Respuesta

26

H.B. es correcto. pero también se puede utilizar RelativeSource Encuadernación

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}"> 
     <ListView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Remove" 
      Command="{Binding RemoveItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" /> 
      </ContextMenu> 
     </ListView.ContextMenu> 
    </ListView> 
+0

Trabajó con RelativeSource - ¡Gracias! –

3

ContextMenus están desconectados, no puede usar enlaces ElementName. Una solución alternativa sería usar Binding.Source y x:Reference, lo que requiere que extraiga partes que lo usen para que estén en los recursos (debido a errores de dependencia cíclica). Puedes poner todo el menú contextual allí.

Un ejemplo:

<ListBox Name="lb" Height="200"> 
    <ListBox.Resources> 
     <ContextMenu x:Key="cm"> 
      <MenuItem Header="{Binding ActualHeight, Source={x:Reference lb}}" /> 
     </ContextMenu> 
    </ListBox.Resources> 
    <ListBox.ContextMenu> 
     <StaticResource ResourceKey="cm" /> 
    </ListBox.ContextMenu> 
</ListBox> 
0

Este trabajo para mí CommandParameter = "{Binding}"

Cuestiones relacionadas