2011-05-05 2 views
1

Dans mon application, j'ai implémenté un pivot avec une zone de liste. En sélectionnant un élément de la liste, vous naviguez vers une autre page. Toujours dans le même élément de boîte de liste, j'ai implémenté un menu contextuel pour la suppression de l'élément de liste sélectionné. Dans certains cas, cela fonctionne parfaitement. Ici, mon problème est que, dans certains cas, tout en maintenant sur l'élément de la liste, le menu contextuel arrive et l'option de suppression apparaît. puis il navigue vers l'autre page et le menu contextuel ne se cache jamais. Quelqu'un s'il vous plaît aidez-moi à résoudre ce problème.Problème de sélection multiple wp7 listbox

Ici, je joins mon extrait de code: -

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

Répondre

1

Malheureusement, votre extrait de code ne le rend pas facile à recréer votre code tel qu'il est lié à des objets que vous n'avez pas spécifié.

Y a-t-il une raison pour laquelle vous n'appliquez pas le ContextMenu à l'intégralité de ListBoxItem? Je n'ai pas vu de problème quand je le faisais de cette façon.

Je suppose que vous naviguez sur SelectionChanged. Vous pouvez ajouter un mouvement Tap (à partir de la boîte à outils) et naviguer à la place.
Je suppose que le problème est que la sélection est définie/modifiée lorsque le menu contextuel commence à être affiché.

0

J'ai une solution possible.

Personnalisez le ItemContainerStyle en ajoutant un StackLayout ou un Grid ou quoi que ce soit autour du ContentControl. Modifiez ensuite les états existants pour afficher ou masquer vos cases à cocher (si nécessaire). Ajoutez une propriété pour lier les cases à cocher qui ne sont pas stockées avec vos données et {Binding YourNewProperty} à la case à cocher XAML.

Vous pourrez désormais contrôler et lire vos cases sélectionnées via votre datacontext.

<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}"/> 

Vous pouvez également accéder directement aux cases à cocher en utilisant les éléments suivants dans une boucle de vos éléments de liste. Je pense que l'utilisation de la technique de liaison est simple.

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