我在 LongListSelector 中使用 ContextMenu,以便可以删除绑定到 LLS 的列表中的一些项目。
我正在遵循最近的指南here http://www.windowsphonegeek.com/articles/the-new-longlistselector-control-in-windows-phone-8-sdk-in-depth为了实现LLS(尽管我没有使用JumpList)。我唯一改变的是让基组类扩展 ObservableCollection 而不是 List。
我遇到的问题是,一旦我实现了 ContextMenu 并从那里删除,我可以从可见列表中的同一“位置”删除两次,然后它就会崩溃。
调试显示,第二次删除后,MenuItem 的 Datacontext 返回上一个被删除的项目。所以当我在列表中搜索它时,我得到的索引是-1。我可以理解这一点,但我不知道如何找出真正选择的项目。
我的 contextMenu 的 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);
两次删除后,(Model.Caritem)menItem.DataContext 返回先前删除的项目。
我已经搜索了一段时间,并发现了几年前针对不同框架和场景的类似案例。我想知道 WP8 中是否有更新的方法可以执行此操作。
我看到过使用 Loaded 或 Opened 事件手动重新分配 ContextMenu 的数据上下文的建议,但 DataContext 仍然依赖于 LLS 中的特定项目。所以我不能仅仅将它的上下文指向 LLS。
我还发现它被指出是一个带有补丁的错误here http://silverlight.codeplex.com/workitem/7888这看起来完全像我的问题,但我不知道如何应用补丁,或者它是否与我的 WP8 情况有关。
我还一直确保 LLS 的所选项目已清除,并尝试在每次操作后重新分配它的 itemSource,但无济于事。
任何正确方向的帮助或建议都会很棒。我在这里看到了一些关于此的帖子,但我相信我已经通过了这些要点(例如简单地获取 menuItem 并使用 ObservableCollection...)。