2012-06-18 8 views
7

Ich habe eine ListView, die eine Liste von String-Werten anzeigt. Ich möchte für jedes Element in der Liste einen Kontextmenüeintrag hinzufügen, um das ausgewählte Element zu entfernen. Meine XAML sieht wie folgt aus:Kontextmenü zum Entfernen von Elementen in der Listenansicht

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

Das Problem ist, dass der CommandParameter Wert immer null ist. Ich habe eine zusätzliche Schaltfläche hinzugefügt, um das ausgewählte Element zu entfernen, um zu überprüfen, ob mein Befehl funktioniert. Die Schaltfläche hat genau die gleiche Bindung und das Entfernen von Elementen über die Schaltfläche funktioniert. Die Schaltfläche sieht wie folgt aus:

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

Der Befehl sieht wie folgt aus:

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

} 

Irgendwelche Ideen, warum das ausgewählte Element null ist, wenn das Kontextmenü zu öffnen? Vielleicht ein Schwerpunktproblem der Listview?

+0

Werfen Sie einen Blick in Ihre Ausgabefenster verwenden können, ich wette, Sie werden eine verbindliche Fehlermeldung finden. Da ein ContextMenu ein neues Fenster ist, bin ich mir nicht sicher, ob es auf itemsListView zugreifen kann. –

+0

Schauen Sie sich http://StackOverflow.com/Questions/1013558/elementname-binding-from-menuitem-in-contextmenu und http://StackOverflow.com/questions/2617122/wpf-menuitem-command-binding-to an -elementname-results-to-system-windows-data-error –

Antwort

26

H. B. ist richtig. aber auch Relative Bindung

<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

Arbeitete mit der RelativeSource - Danke! –

3

ContextMenus sind getrennt, Sie können ElementName Bindings nicht verwenden. Eine Problemumgehung wäre die Verwendung von Binding.Source und x:Reference, die erfordert, dass Sie Teile extrahieren, die es verwenden, um in den Ressourcen zu sein (aufgrund von zyklischen Abhängigkeitsfehlern). Sie können einfach das gesamte Kontextmenü dort platzieren.

Ein Beispiel:

<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

Diese Arbeit für mich Command = „{Binding}“

Verwandte Themen