2012-12-29 14 views
7

Ich verwende ein ContextMenu in einem LongListSelector, damit ich einige Elemente in der Liste löschen kann, die an LLS gebunden sind.ContextMenu MenuItem DataContext gibt alte Elemente zurück

Ich befolge eine aktuelle Anleitung here, um die LLS zu implementieren (obwohl ich die JumpList nicht verwende). Das einzige, was ich geändert habe, ist, dass die Basisgruppenklasse ObservableCollection statt List erweitert.

Das Problem, das ich habe, ist, dass, sobald ich das ContextMenu implementiert habe und von dort lösche, kann ich von der gleichen "Position" in der sichtbaren Liste zweimal löschen und dann würde es abstürzen. Debugging zeigt, dass nach dem zweiten Löschen der Datacontext des MenuItem das vorherige Element zurückgibt, das gelöscht wurde. Wenn ich in der Liste danach suche, ist der Index, den ich bekomme, -1. Ich kann das fangen, aber ich weiß nicht, wie ich dann herausfinden soll, was wirklich als Gegenstand ausgewählt wurde.

Meine XAML Abschnitt für die contextMenu ist wie folgt:

<phone:LongListSelector.ItemTemplate> 
    <DataTemplate> 
     <Grid toolkit:TiltEffect.IsTiltEnabled="True"> 
      <toolkit:ContextMenuService.ContextMenu> 
       <toolkit:ContextMenu x:Name="conmen" Loaded="ContextMenu_Loaded"> 
         <toolkit:MenuItem Header="Delete" Click="DeleteItem_Click"/> 
       </toolkit:ContextMenu> 
      </toolkit:ContextMenuService.ContextMenu> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 

      <Border Grid.Column="0" Background="{StaticResource PhoneInverseBackgroundBrush}" Padding="{StaticResource PhoneTouchTargetOverhang}"> 
       <TextBlock Text="{Binding Usr, StringFormat='x{0}'}" FontSize="32" HorizontalAlignment="Left" Width="48"/> 
      </Border> 

      <Border Grid.Column="1" Background="{StaticResource PhoneInverseBackgroundBrush}" Padding="{StaticResource PhoneTouchTargetOverhang}"> 
       <TextBlock Text="{Binding Name}" FontSize="32" HorizontalAlignment="Left" /> 
      </Border> 

      <Border Grid.Column="2" Background="{StaticResource PhoneInverseBackgroundBrush}" Padding="{StaticResource PhoneTouchTargetOverhang}"> 
       <TextBlock Text="{Binding Type, StringFormat=\{0:C\}}" FontSize="32" HorizontalAlignment="Right" /> 
      </Border> 
     </Grid> 
    </DataTemplate> 
</phone:LongListSelector.ItemTemplate> 

Und dies ist der Beginn meiner delete_click Funktion das Element zu entfernen:

private void DeleteItem_Click(object sender, RoutedEventArgs e) 
    {    
     var menItem = (MenuItem)sender; 
     editCartItem = (Model.Cartitem)menItem.DataContext; 

     cartIndex = editCartItem.Id; 

     deleteIndex = this.cartList.FindIndex(FindItem); 

Nach zwei Löschungen, die (Modell. Cartitem) menItem.DataContext gibt das zuvor gelöschte Element zurück.

Ich habe eine Weile gesucht und ähnliche Fälle für verschiedene Frameworks und Szenarien aus einigen Jahren gefunden. Ich wollte wissen, ob es in WP8 eine aktualisierte Methode dafür gibt.

Ich habe Vorschläge beim manuellen Neuzuweisen des Datenkontextes des ContextMenu mit einem Loaded oder Opened-Ereignis gesehen, aber der DataContext beruht immer noch auf einem bestimmten Element in der LLS. Ich kann also nicht einfach auf die LLS verweisen.

Ich habe auch gesehen, dass es als ein Fehler mit einem Patch here gezeigt wurde, die genau wie mein Problem scheint, aber ich hatte keine Ahnung, wie man den Patch anwenden oder ob es sogar zu meiner Situation mit WP8.

Ich habe auch sichergestellt, dass der LLS ausgewählten Artikel gelöscht wird und habe versucht, seine itemSource nach jeder Operation vergebens vergeben.

Jede Hilfe oder Beratung in die richtige Richtung wäre toll. Ich habe einige Beiträge dazu hier gesehen, aber ich glaube, dass ich diese Punkte bereits passiert habe (wie zum Beispiel das menuItem zu bekommen und eine ObservableCollection zu verwenden ...).

Antwort

0

Ich komme in einer simular Ausgabe:

Wenn Elemente zu einem Listenfeld der Datacontext des menuitem zu den neu hinzugefügten Elementen gehört, das Hinzufügen ist nicht richtig eingestellt.

Die Abhilfe, die ich war am Ende der Umsetzung der Listbox für den Wiederaufbau nach dem ein Element hinzugefügt:

 MyListBox.ItemsSource = null; 
     MyListBox.Items.Clear(); 
     MyListBox.ItemsSource = theList; 

Nicht sicher, wenn auch für Ihr Problem arbeiten würde ...
Auch die Auswirkungen auf die Leistung für Listboxen mit vielen Gegenstände sollten berücksichtigt werden.

+0

Ich habe etwas ähnliches von der tatsächlich wurde get-go verwenden. Es hat keine Auswirkungen auf mein Problem. Da ich mit einem LLS arbeite, hat es auch keine einfache Clear() - Funktion. Es gibt eine ClearValue-Funktion, die die Abhängigkeit übernimmt, ich werde es versuchen. – Poken1151

+0

Für die LLS konnte ich etwas wie das Folgende implementieren: 'this.LLStructure.ItemsSource = null; this.LLStructure.ClearValue (FrameworkElement.DataContextProperty); ' Es löste ein visuelles Problem, das ich hatte, aber es verbreitet sich immer noch nicht zum ContextMenu. Das Löschen der Liste führt schließlich zu einem MemberItem, das nicht existiert. – Poken1151

Verwandte Themen