2012-12-29 10 views
7

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

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

ContextMenuを実装してそこから削除すると、表示可能なリストの同じ「場所」から2回削除してクラッシュするという問題があります。 デバッグでは、2回目の削除後に、MenuItemのDatacontextが削除された前の項目を返すことが示されています。だから私がリスト内でそれを検索すると、私が得るインデックスは-1です。私はこれをキャッチすることができますが、実際にアイテムとして選択されたものを見つけ出す方法はわかりません。

<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機能の開始である:のcontextMenuため

私のXAMLのセクションでは、以下の通りである2つの削除、(モデル後

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

を。 CartItem)menItem.DataContextは、以前に削除された項目を返します。

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

私は、ContextMenuのdatacontextをLoadedまたはOpenedイベントで手動で再割り当てすることを提案しましたが、DataContextは引き続きLLSの特定の項目に依存しています。だから、私はそれがLLSの文脈を指すだけではない。

パッチhereのバグとして指摘されていますが、これは私の問題とまったく同じように見えますが、パッチを適用する方法がわからない、あるいはWP8で自分の状況に関係があったとしても、

私はLLSの選択したアイテムがクリアされていることを確認しており、各操作後にアイテムソースを無駄に再割り当てしようとしました。

正しい方向への助力やアドバイスは素晴らしいでしょう。私はここでこれについていくつかの記事を見てきましたが、私はすでに(メニュー項目を取得し、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

関連する問題