2012-12-29 11 views
7

Sto utilizzando un ContextMenu all'interno di LongListSelector in modo che sia possibile eliminare alcuni elementi nell'elenco limitato a LLS.Menu ContextMenu's MenuItem DataContext restituisce i vecchi articoli

Sto seguendo una guida recente here per implementare il LLS (anche se non sto utilizzando JumpList). L'unica cosa che ho cambiato è che la classe del gruppo base estenda ObservableCollection invece di List.

Il problema che sto avendo è che una volta che ho implementato il ContextMenu e DELETE da lì, posso cancellare dalla stessa "location" in teh lista visibile due volte e poi si potrebbe andare in crash. Il debug mostra che dopo la seconda eliminazione, il Datacontext di MenuItem restituisce l'elemento precedente che è stato eliminato. Quindi quando lo cerco nella lista, l'indice che ottengo è -1. Posso prenderlo ma non so come poi scoprire cosa è stato realmente selezionato come oggetto.

sezione My XAML per il contextMenu è la seguente:

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

E questo è l'inizio della mia funzione delete_click per rimuovere la voce:

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

Dopo due eliminazioni, il (modello. Cartitem) menItem.DataContext restituisce l'elemento precedentemente eliminato.

Sono stato alla ricerca di un po 'e ho trovato casi simili per diversi quadri e scenari di alcuni anni prima. Volevo sapere se c'era un metodo aggiornato per farlo in WP8.

Ho visto suggerimenti per riassegnare manualmente il datacontext del ContextMenu con un evento Loaded o Opened, ma DataContext si basa ancora su un elemento specifico nel LLS. Quindi non posso semplicemente indicare il suo contesto alle LLS.

Ho anche notato che è stato segnalato come un bug con una patch here che sembra esattamente come il mio problema, ma non avevo idea di come applicare la patch o se fosse pertinente alla mia situazione con WP8.

Ho anche assicurato che l'elemento selezionato di LLS è stato cancellato e ho provato a riassegnare il suo itemSource dopo ogni operazione senza alcun risultato.

Qualsiasi aiuto o consiglio nella giusta direzione sarebbe fantastico. Ho visto alcuni post su questo argomento, ma credo di aver già superato quei punti (come semplicemente ottenere il menuItem e utilizzare ObservableCollection ...).

risposta

0

Ho appena imbattuto in un problema simular:

Quando si aggiungono elementi a una casella di riepilogo il DataContext del MenuItem appartenenti alle voci appena aggiunti non è impostato correttamente.

La soluzione ho finito attuazione è stato quello di ricostruire la casella di riepilogo dopo l'aggiunta di un elemento:

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

Non è sicuro, se sarebbe anche lavorare per il vostro problema ...
Anche l'impatto sulle prestazioni per listboxes con molti gli articoli dovrebbero essere considerati.

+0

ho in realtà usando qualcosa di simile dal get-go. Non ha alcun impatto sul mio problema. Inoltre, dal momento che sto lavorando con un LLS, non ha una semplice funzione Clear(). C'è una funzione ClearValue che prende la dipendenza, ci provo. – Poken1151

+0

Per LLS sono stato in grado di implementare qualcosa di simile al seguente: 'this.LLSStructure.ItemsSource = null; this.LLSStructure.ClearValue (FrameworkElement.DataContextProperty); ' Ha risolto un problema visivo che stavo avendo, ma non si propaga ancora al ContextMenu. Quindi, eliminando l'elenco alla fine si arriverà a un MemberItem che non esiste. – Poken1151

Problemi correlati