2012-06-18 10 views
7

Mam ListView, który wyświetla listę wartości łańcuchowych. Chcę dodać pozycję menu kontekstowego dla każdego elementu na liście, aby usunąć wybrany element. Moje XAML wygląda następująco:menu kontekstowe do usuwania elementów w widoku listy

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

Problem polega na tym, że wartość CommandParameter zawsze ma wartość null. Dodałem dodatkowy przycisk, aby usunąć wybrany element, aby sprawdzić, czy moje polecenie działa. Przycisk ma dokładnie to samo wiązanie i usuwanie elementów za pomocą przycisku działa. Przycisk wygląda następująco:

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

Komenda wygląda następująco:

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

} 

jakieś pomysły dlaczego wybrana pozycja jest zerowa podczas otwierania menu kontekstowego? Może problem z listview?

+0

Zapraszamy do obejrzenia w oknie Output, założę znajdziesz wiążącej komunikat o błędzie. Ponieważ ContextMenu jest nowym oknem, nie jestem pewien, czy może uzyskać dostęp do itemsListView. –

+0

Zobacz http://stackoverflow.com/questions/1013558/elementname-binding-from-menuitem-in-contextmenu i http://stackoverflow.com/questions/2617122/wpf-menuitem-command- bind-to -elementname-results-to-system-windows-data-error –

Odpowiedz

26

H.B. jest w porządku. ale można też użyć RelativeSource Oprawa

<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

Praca z RelativeSource - Dzięki! –

3

ContextMenus są rozłączone, nie można używać wiązań ElementName. Jednym obejściem byłoby użycie Binding.Source i x:Reference, która wymaga wyodrębnienia części, które używają go do zasobów (z powodu cyklicznych błędów zależności). Możesz po prostu umieścić całe menu kontekstowe.

Przykład:

<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

tej pracy dla mnie CommandParameter = „{Binding}”

Powiązane problemy