2016-04-07 15 views
0

So habe ich Probleme, einen richtigen SelectedIndex in einem Klickereignis zurück. Egal, welche Artikel ich wählen, ich zurück immer -1Kann keinen gültigen ListView.SelectedIndex

Hier ist meine Veranstaltung:

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

Und hier meine Listview ist:

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

Ich verstehe wirklich nicht, warum ich Ich kann meinen SelectedIndex nicht bekommen, weil ich dasselbe in einem früheren Projekt gemacht habe und es einwandfrei funktioniert hat.

Ich habe auch versucht, SelectedItems vergeblich zu manipulieren.

einige zusätzliche Details: Ich bin ein Windows Phone 8.1 App Entwicklung (WinRT) Visual Studio 2015 Update 1.

+0

Aus curosity ändern würden, wenn Sie in Ihrem CitiesDisplay Objekt debuggen ist es alles in der Sammlung haben? – CathalMF

+0

@CathalMF Beim Debuggen in CitiesDisplay habe ich tatsächlich die Items-Sammlung, die meine Artikel enthält (und sie werden trotzdem angezeigt). –

+0

Verbindest du deine Listenansicht im Code mit CitiesDisplay.ItemsSource = MyItems; Vielleicht, wenn Sie die Anzeige ändern, wird die Objektquelle zurückgesetzt. – CathalMF

Antwort

0

Ja Ihre SelectedIndex wird immer mit bleiben, wie -1, da weder ItemClick noch SelectionChanged Ereignisse aufgrund auslösen würde, Die Entwurfsbeschränkung des Klickereignisses wird von Ihrem ItemTemplate Stackpanel-Ereignis Holding verbraucht. diese
beheben Sie würden

  1. Zwingen Sie VisualTree bis zum Mutter ItemTemplate
  2. Typecast seinen Inhalt zu Ihrem Bindungsmodell zu durchlaufen und versuchen, den Wert zu erhalten.

Ihre XAML bleiben würde denselben Code zurück

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