2016-04-07 3 views
0

J'ai donc du mal à retrouver un SelectedIndex correct dans un événement click. Peu importe quel élément je choisis, je reçois toujours revenir -1Impossible d'obtenir un ListView.SelectedIndex valide

Voici mon événement:

private void Delete_Click(object sender, RoutedEventArgs e) 
{ 
    var index = CitiesDisplay.SelectedIndex; 
    if(CitiesDisplay.SelectedIndex >= 0) 
    { 
     vm.Cities.Remove(vm.Cities[index]); 
    } 
} 

Et voici mon ListView:

<ListView Name="CitiesDisplay" ItemsSource="{Binding}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical" Holding="ListViewItem_Holding"> 
       <!-- Begin Flyout menu --> 
       <FlyoutBase.AttachedFlyout> 
        <MenuFlyout> 
         <MenuFlyoutItem Text="Delete" Click="Delete_Click"/> 
         <MenuFlyoutItem Text="Navigate To" Click="NavigateTo_Click"/> 
        </MenuFlyout> 
       </FlyoutBase.AttachedFlyout> 
       <!-- End Flyout Menu --> 
       <StackPanel Orientation="Horizontal"> 
        <StackPanel Orientation="Vertical"> 
         <TextBlock Name="CityName" Text="{Binding Name}" FontSize="20"></TextBlock> 
         <TextBlock Name="MaxTemp" Text="{Binding max}"/> 
         <TextBlock Name="MinTemp" Text="{Binding min}"/> 
         <TextBlock Name="CurrentTemp" Text="{Binding temp}"/> 
        </StackPanel> 
        <Image Name="Logo" Width="50" Height="50" Source="{Binding icon}" HorizontalAlignment="Right" Margin="5"/> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Je ne comprends vraiment pas pourquoi je ne peut pas obtenir mon SelectedIndex parce que j'ai fait la même chose dans un projet précédent et cela a fonctionné parfaitement.

J'ai également essayé de manipuler SelectedItems en vain.

Quelques détails supplémentaires: Je développe un Windows Phone 8.1 App (WinRT) en utilisant Visual Studio 2015 Mise à jour 1.

+0

Sur curosity si vous déboguer dans votre objet CitiesDisplay-t-il quoi que ce soit dans la collection? – CathalMF

+0

@ChathalMF Lors du débogage dans CitiesDisplay, j'ai effectivement la collection Items, qui contient mes items (et ils sont quand même affichés). –

+0

Liez-vous votre vue de liste dans le code avec quelque chose comme CitiesDisplay.ItemsSource = MyItems; Peut-être que lorsque vous changez l'affichage, la source de l'élément est en train de tout réinitialiser. – CathalMF

Répondre

0

Oui, votre SelectedIndex restera toujours aussi -1 que ni ItemClick ni SelectionChanged événements déclencheraient en raison de la contrainte de conception de l'événement click étant consommée par votre événement ItemTemplate Stackpanel Holding.
Pour résoudre ce problème vous

  1. ont besoin pour traverser votre VisualTree jusqu'à ce que le parent ItemTemplate
  2. Typecast son contenu à votre modèle de liaison et essayer d'obtenir la valeur.

Votre XAML demeurerait même votre code derrière changerait pour

private DependencyObject GetDependencyObjectFromVisualTree(DependencyObject startObject, Type type) 
     {    
      DependencyObject parent = startObject; 
      while (parent != null) 
      { 
       if (type.IsInstanceOfType(parent)) 
        break; 
       else 
        parent = VisualTreeHelper.GetParent(parent); 
      } 
      return parent; 
     } 


     private void Delete_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
     { 
      var selectedItem = GetDependencyObjectFromVisualTree(e.OriginalSource as DependencyObject, typeof(ListViewItem)) as ListViewItem;  
//here you can use it to traverse your vm.Cities list to update it or do anything. 
      System.Diagnostics.Debug.WriteLine(((YourModel)selectedItem.Content).Cities); 
     }