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을 사용하는 것과 같다.)
. 내 문제에는 아무런 영향을 미치지 않습니다. 또한 LLS로 작업 중이므로 간단한 Clear() 함수가 없습니다. 종속성을 가져 오는 ClearValue 함수가 있습니다. 시도해 보겠습니다. – Poken1151
LLS의 경우 다음과 같이 구현할 수있었습니다 : 'this.LLSStructure.ItemsSource = null; this.LLSStructure.ClearValue (FrameworkElement.DataContextProperty); ' 시각적 인 문제가 해결되었지만 여전히 ContextMenu로 전파되지 않습니다. 따라서 목록을 삭제하면 결국 존재하지 않는 MemberItem이 생성됩니다. – Poken1151