2012-06-18 2 views
7

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

Проблема заключается в том, что значение CommandParameter всегда нуль. Я добавил дополнительную кнопку, чтобы удалить выбранный элемент, чтобы проверить, работает ли моя команда. Кнопка имеет точно такую ​​же привязку и удаление элементов с помощью кнопки. Кнопка выглядит следующим образом:

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

Команда выглядит следующим образом:

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

} 

Любые идеи, почему выбранный элемент является нулевым при открытии контекстного меню? Может быть, проблема фокуса в списке?

+0

Посмотрите в окне Output, я уверен, вы увидите сообщение об ошибке связывания. Поскольку ContextMenu - это новое окно, я не уверен, что он может получить доступ к элементамListView. –

+0

Осмотрите http://stackoverflow.com/questions/1013558/elementname-binding-from-menuitem-in-contextmenu и http://stackoverflow.com/questions/2617122/wpf-menuitem-command-binding-to -elementname-results-to-system-windows-data-error –

ответ

26

H.B. верно. но вы также можете использовать RelativeSource Binding

<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

Работает с RelativeSource - Спасибо! –

3

ContextMenus отключены, вы не можете использовать привязки ElementName. Одним из способов было бы использовать Binding.Source и x:Reference, которые требуют, чтобы вы извлекли части, которые используют его для использования в ресурсах (из-за циклических ошибок зависимостей). Вы можете просто разместить здесь все контекстное меню.

Пример:

<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

Эта работа для меня CommandParameter = «{Binding}»