2012-12-29 2 views
7

LLS에 묶여있는 목록의 일부 항목을 삭제할 수 있도록 LongListSelector 내에서 ContextMenu를 사용하고 있습니다.ContextMenu의 MenuItem DataContext가 이전 항목을 반환합니다.

나는 LLS를 구현하기 위해 최근 가이드 here을 따르고있다. (나는 JumpList를 사용하지 않지만). 내가 변경 한 유일한 것은 기본 그룹 클래스가 List 대신 ObservableCollection을 확장하도록하는 것입니다.

내가 겪고있는 문제는 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); 

합니다. CartItem) menItem.DataContext는 이전에 삭제 된 항목을 반환합니다.

저는 잠시 동안 검색을 해왔으며 몇 년 전부터 다른 프레임 워크와 시나리오에 대해 유사한 사례를 발견했습니다. WP8에서이 작업을 수행 할 수있는 업데이트 된 방법이 있는지 알고 싶었습니다.

ContextMenu의 datacontext를 Loaded 또는 Opened 이벤트로 수동으로 다시 할당하는 방법을 제안했지만 DataContext는 여전히 LLS의 특정 항목에 의존합니다. 그래서 저는 LLS의 맥락을 지적 할 수 없습니다.

나는 또한 내 문제와 똑같은 패치 here이있는 버그로 지적되었지만 패치를 적용하는 방법이나 WP8로 내 상황과 관련이 있는지에 대해서는 잘 모른다.

나는 또한 LLS의 선택된 항목이 지워 졌음을 확인하고 각 작업 후에 무상으로 itemSource를 다시 할당하려고 시도했습니다.

올바른 방향으로 어떤 도움이나 조언도 좋을 것입니다. 나는 여기에 대해 몇 가지 게시물을 보았지만, 나는 그 점들을 이미 지나쳤다 고 믿는다. (단순히 menuItem을 얻고 ObservableCollection을 사용하는 것과 같다.)

답변

0

난 그냥 시뮬 문제를 건너 왔어요 :

목록 상자에 새로 추가 된 항목에 속하는 메뉴 항목의 데이터 컨텍스트를 항목을 추가 올바르게 설정되어 있지 않습니다. 또한 ... 당신의 문제에 대한 또
많은과리스트 박스의 성능에 미치는 영향을 작동 할 경우,

 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