我正在使用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 ...)。
。它對我的問題沒有影響。另外,由於我正在使用LLS,因此它沒有簡單的Clear()函數。 有一個ClearValue函數需要依賴,我會試一試。 – Poken1151
對於LLS我能夠實現如下內容: 'this.LLSStructure.ItemsSource = null; this.LLSStructure.ClearValue(FrameworkElement.DataContextProperty);' 它解決了我遇到的視覺問題,但它仍不會傳播到ContextMenu。因此,刪除列表最終會導致不存在的MemberItem。 – Poken1151