2016-04-07 2 views
0

Так что у меня возникли проблемы с возвратом правильного SelectedIndex в событие click. Независимо от того, какой пункт я выбираю, я всегда вернусь -1Не удается получить действительный ListView.SelectedIndex

Вот мое событие:

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

И вот мой 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> 

Я действительно не понимаю, почему я не может получить мой SelectedIndex, потому что я сделал то же самое в предыдущем проекте, и он работал безупречно.

Я также пытался манипулировать SelectedItems безрезультатно.

Некоторые дополнительные подробности: Я разрабатываю Windows Phone 8.1 App (WinRT) с помощью Visual Studio 2015 Update 1.

+0

Из curosity при отладке в ваш объект CitiesDisplay у него есть что-нибудь в коллекции? – CathalMF

+0

@CathalMF При отладке в CitiesDisplay у меня действительно есть коллекция Items, которая содержит мои элементы (и они отображаются в любом случае). –

+0

Вы связываете свой просмотр списка в коде с чем-то вроде CitiesDisplay.ItemsSource = MyItems; Возможно, когда вы меняете дисплей, источник элемента сбрасывает все. – CathalMF

ответ

0

Да ваш SelectedIndex всегда будет оставаться -1, как ни ItemClick, ни SelectionChanged события будут вызывать из-за проектное ограничение события клика, потребляемого вашим ItemTemplate Событием Stackpanel's Holding.
Чтобы исправить это, вы бы

  1. Требовать, чтобы пройти свой VisualTree до родителя ItemTemplate
  2. приведение его содержания в вашей Binding модели и попытаться получить значение.

Ваш XAML будет оставаться таким же код позади изменится на

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); 
     } 
Смежные вопросы