2012-12-29 65 views
7

我正在使用LongListSelector內的ContextMenu,以便可以刪除列表中的一些項目,並綁定到LLS。ContextMenu的MenuItem DataContext返回舊項目

我遵循最近的指南here爲了實現LLS(儘管我沒有使用JumpList)。我唯一改變的是讓基類組擴展ObservableCollection而不是List。

我遇到的問題是,一旦我實現了ContextMenu並從那裏刪除,我可以從可見列表中的相同「位置」刪除兩次,然後它會崩潰。 調試顯示在第二次刪除後,MenuItem的Datacontext返回之前刪除的項目。所以當我在列表中搜索它時,我得到的索引是-1。我可以理解這一點,但我不知道如何才能找出真正選定的項目。

的文本菜單我的XAML部分是如下:

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

這是我delete_click功能開始刪除項目:

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

2個刪除時,(型號後。 Cartitem)menItem.DataContext返回以前刪除的項目。

我一直在尋找一段時間,並發現了幾年前不同框架和場景的類似案例。我想知道在WP8中是否有更新的方法。

我已經看到過使用Loaded或Opened事件手動重新分配ContextMenu的datacontext的建議,但DataContext仍然依賴於LLS中的特定項目。所以我不能把它的背景指向LLS的。

我也看到它被指向爲一個修補程序here的錯誤,這看起來與我的問題完全相同,但我不知道如何應用該修補程序或者它是否與WP8有關。

我也一直在確保LLS的選定項目被清除,並嘗試在每次操作後重新分配它的itemSource無濟於事。

任何正確方向的幫助或建議都會很棒。我在這裏看過一些關於這個的帖子,但我相信我已經通過了這些觀點(比如簡單地獲取menuItem並使用ObservableCollection ...)。

回答

0

我剛碰到類似問題:

將項目添加到列表框時,屬於新添加項目的菜單項目的datacontext設置不正確。

我最終實施的解決方法是增加一個項目後重建列表框:

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

不知道,如果也將針對您的問題工作...
也爲列表框的性能影響有許多項目應該被考慮。

+0

。它對我的問題沒有影響。另外,由於我正在使用LLS,因此它沒有簡單的Clear()函數。 有一個ClearValue函數需要依賴,我會試一試。 – Poken1151

+0

對於LLS我能夠實現如下內容: 'this.LLSStructure.ItemsSource = null; this.LLSStructure.ClearValue(FrameworkElement.DataContextProperty);' 它解決了我遇到的視覺問題,但它仍不會傳播到ContextMenu。因此,刪除列表最終會導致不存在的MemberItem。 – Poken1151

2

XAML:

<toolkit:ContextMenu Opened="ContextMenu_Opened">... </toolkit:ContextMenu> 

C#

private void ContextMenu_Opened(object sender, RoutedEventArgs e) 
{ 
    var menu = (ContextMenu)sender; 
    var owner = (FrameworkElement)menu.Owner; 
    if (owner.DataContext != menu.DataContext) 
     menu.DataContext = owner.DataContext; 
} 

你可以看到:我其實一直在使用從一開始就類似的東西Windows Phone Toolkit Context Menu Items have wrong object bound to them when an item is removed and then added