2011-05-05 5 views
1

내 응용 프로그램에서 나는 목록 상자가있는 피벗을 구현했습니다. 목록 상자 항목을 선택하면 다른 페이지로 이동합니다. 또한 같은 목록 상자 항목에서 선택한 목록 항목을 삭제하기위한 컨텍스트 메뉴를 구현했습니다. 어떤 경우에는 완벽하게 작동합니다. 여기에 내 문제는 어떤 경우에는 목록 상자 항목을 누른 상태에서 컨텍스트 메뉴가 나타나고 삭제 옵션이 나타납니다. 그런 다음 다른 페이지로 이동하고 컨텍스트 메뉴 팝업이 숨겨지지 않습니다. 어느 누구도이 문제를 해결할 수 있도록 도와주세요. 다중 선택 문제 wp7 목록 상자

여기에 내 코드를 부착하고있다 : -

<DataTemplate x:Key="GroupLoadedTemplate"> 
     <Grid Height="120" Width="480" VerticalAlignment="Top"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="110"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Border Height="105" Width="110" BorderBrush="White" Grid.Column="0" BorderThickness="2"> 
       <Image delay:LowProfileImageLoader.UriSource="{Binding Path=Avatar}" Source="/Image/default-thumb-groups.png"/> 
      </Border> 
      <Grid Grid.Column="1"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="4"/> 
        <RowDefinition Height="35"/> 
        <RowDefinition Height="50"/> 

        <RowDefinition Height="*"/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="10" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding Path=Name,Mode=TwoWay}" Grid.Column="1" Grid.Row="1" FontFamily="Segoe WP Light" FontSize="30" Foreground="{StaticResource PhoneForegroundBrush}" TextWrapping="Wrap"/> 
       <TextBlock Text="{Binding Path=Members,Mode=TwoWay}" Grid.Column="2" Grid.Row="2" FontFamily="Segoe WP Light" HorizontalAlignment="Left" FontSize="20" Opacity="0.91" Foreground="{StaticResource PhoneForegroundBrush}" TextWrapping="Wrap"/> 

       <toolkit:ContextMenuService.ContextMenu> 
        <toolkit:ContextMenu Name="DeleteGroup" Tag="{Binding Nid,Mode=TwoWay}" Visibility="{Binding ElementName=GroupList, Path=DataContext.DeleteStatus,Mode=TwoWay, Converter={StaticResource booleanToVisibility}}" IsZoomEnabled="False"> 
         <toolkit:MenuItem Header="delete group"> 
          <Interactivity:Interaction.Triggers> 
           <Interactivity:EventTrigger EventName="Click"> 
            <Command:EventToCommand Command="{Binding ElementName=GroupList, Path=DataContext.DeleteCommand,Mode=TwoWay}" CommandParameter="{Binding ElementName=DeleteGroup}" PassEventArgsToCommand="True"/> 
           </Interactivity:EventTrigger> 
          </Interactivity:Interaction.Triggers> 
         </toolkit:MenuItem> 
        </toolkit:ContextMenu> 
       </toolkit:ContextMenuService.ContextMenu> 


      </Grid> 
     </Grid> 
    </DataTemplate> 

답변

1

불행하게도 당신의 코드는 그것이 당신이 지정하지 않은 객체에 바인딩으로 쉽게 코드를 다시하지 않습니다.

전체 ListBoxItem에 ContextMenu를 적용하지 않는 이유가 있습니까? 나는 그런 식으로 할 때 문제를 보지 못했습니다.

내가 SelectionChanged에서 탐색 중이라고 가정합니다. 툴박스에서 Tap 제스처를 추가하고 대신 탐색 할 수 있습니다.
컨텍스트 메뉴가 표시되기 시작하면 선택 항목이 설정/변경되는 것이 문제라고 가정합니다.

0

가능한 해결책이 있습니다.

ItemContainerStyle을 사용자 정의하여 StackLayout 또는 Grid 또는 ContentControl 주변의 항목을 추가하십시오. 그런 다음 기존 상태를 수정하여 확인란을 표시하거나 숨 깁니다 (필요한 경우). 데이터에 저장되지 않은 확인란을 바인딩하는 속성을 추가하고 {YourNewProperty 바인딩}을 XAML 확인란에 바인딩합니다.

이제 데이터 영역을 통해 선택한 확인란을 제어하고 읽을 수 있습니다.

<CheckBox Content="CheckBox" Margin="0,0,50,0" VerticalAlignment="Top" d:LayoutOverrides="Width" IsChecked="{Binding YourNewProperty}"/> 
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}"/> 

목록 상자 항목의 루프에서 다음을 사용하여 확인란에 직접 액세스 할 수도 있습니다. 나는 Binding 기법을 사용하는 것이 간단하다고 생각한다.

foreach (var loopItem in listBox1.Items) 
{ 
      ListBoxItem itemToCheck = listBox1.ItemContainerGenerator.ContainerFromItem(loopItem) as ListBoxItem; 

      // code to find the check box control 
      // find a ContentPresenter of that list item.. [Call FindVisualChild Method] 
       ContentPresenter ContentPresenterObj = FindVisualChild<ContentPresenter>(itemToCheck); 

       // call FindName on the DataTemplate of that ContentPresenter 
       DataTemplate DataTemplateObj = ContentPresenterObj.ContentTemplate; 
       CheckBox Chk = (CheckBox)DataTemplateObj.FindName("ChkList", ContentPresenterObj); 

       // get a selected checkbox items. 
       if (Chk.IsChecked == true) 
       { 
        MessageBox.Show(Chk.Content.ToString().Trim()); 
       } 
}