7

LLS にバインドされたリスト内のいくつかの項目を削除できるように、LongListSelector 内で ContextMenu を使用しています。

LLS を実装するために、最近のガイドhereに従っています (ただし、JumpList は使用していません)。私が変更した唯一のことは、基本グループ クラスが List ではなく ObservableCollection を拡張するようにしたことです。

私が抱えている問題は、ContextMenu を実装してそこから削除すると、表示されているリストの同じ「場所」から 2 回削除すると、クラッシュすることです。デバッグは、2 回目の削除の後、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);

2 回の削除の後、(Model.Caritem)menItem.DataContext は以前に削除されたアイテムを返します。

私はしばらく探していて、数年前からさまざまなフレームワークとシナリオで同様のケースを見つけました。WP8でこれを行うための更新された方法があるかどうか知りたかった.

Loaded または Opened イベントを使用して ContextMenu のデータ コンテキストを手動で再割り当てする提案を見てきましたが、DataContext は依然として LLS の特定の項目に依存しています。したがって、そのコンテキストをLLSに向けることはできません。

また、私の問題とまったく同じように思われるパッチのバグとして指摘されていることも確認しましたが、パッチを適用する方法や、WP8 の状況に関係があるかどうかさえわかりませんでした。

また、LLS の選択された項目がクリアされていることを確認しており、各操作の後に itemSource を無駄に再割り当てしようとしました。

正しい方向への助けやアドバイスは素晴らしいでしょう。私はこれについてここでいくつかの投稿を見てきましたが、私はすでにそれらのポイントを通過したと信じています (単純に menuItem を取得し、ObservableCollection を使用するなど...)。

4

2 に答える 2

0

同様の問題が発生

しました。リストボックスにアイテムを追加すると、新しく追加されたアイテムに属するメニューアイテムのデータコンテキストが正しく設定されません。

私が実装することになった回避策は、アイテムを追加した後にリストボックスを再構築することでした。

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

問題が解決するかどうかはわかりません...
また、多くの項目を含むリストボックスのパフォーマンスへの影響も考慮する必要があります。

于 2013-01-24T11:05:07.133 に答える