【问题标题】:ContextMenu's MenuItem DataContext returns old itemsContextMenu 的 MenuItem DataContext 返回旧项
【发布时间】:2012-12-29 18:39:50
【问题描述】:

我在 LongListSelector 中使用 ContextMenu,以便我可以删除绑定到 LLS 的列表中的一些项目。

我正在关注最近的指南here 以实施 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 的错误,这似乎与我的问题完全一样,但我不知道如何应用补丁,甚至不知道它是否与我使用 WP8 的情况有关.

我也一直在确保 LLS 的选定项目已被清除,并尝试在每次操作后重新分配它的 itemSource,但无济于事。

在正确方向上的任何帮助或建议都会很棒。我在这里看到了一些关于此的帖子,但我相信我已经通过了这些要点(例如简单地获取 menuItem 并使用 ObservableCollection...)。

【问题讨论】:

    标签: windows-phone-8 wpftoolkit


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      我刚刚遇到了一个类似的问题:

      将项目添加到列表框时,属于新添加项目的菜单项的数据上下文设置不正确。

      我最终实施的解决方法是在添加项目后重建列表框:

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

      不确定,是否也适用于您的问题...
      还应考虑包含许多项目的列表框的性能影响。

      【讨论】:

      • 我实际上从一开始就在使用类似的东西。它对我的问题没有影响。此外,由于我使用的是 LLS,它没有简单的 Clear() 函数。有一个带依赖的 ClearValue 函数,我试试看。
      • 对于 LLS,我能够实现以下内容:this.LLSStructure.ItemsSource = null; this.LLSStructure.ClearValue(FrameworkElement.DataContextProperty); 它解决了我遇到的一个视觉问题,但它仍然不会传播到 ContextMenu。所以从列表中删除最终会导致一个不存在的 MemberItem。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多