无法获得有效的 ListView.SelectedIndex
Posted
技术标签:
【中文标题】无法获得有效的 ListView.SelectedIndex【英文标题】:Can't get a valid ListView.SelectedIndex 【发布时间】:2016-07-28 02:01:57 【问题描述】:所以我无法在点击事件中取回正确的 SelectedIndex。无论我选择什么项目,我总是返回-1
这是我的活动:
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 无济于事。
一些额外的细节:我正在使用 Visual Studio 2015 Update 1 开发一个 Windows Phone 8.1 应用程序 (winrt)。
【问题讨论】:
出于好奇,如果您调试到您的 CitiesDisplay 对象,它的集合中是否有任何内容? @CathalMF 在调试到 CitiesDisplay 时,我确实有 Items 集合,其中包含我的项目(并且它们无论如何都会显示)。 您是否将代码中的列表视图与 CitiesDisplay.ItemsSource = MyItems; 之类的东西绑定在一起?也许当您更改显示时,项目源正在重置所有内容。 是的,我这样绑定它:CitiesDisplay.DataContext = vm.Cities(其中 vm 是我的 ViewModel) 你在哪里设置你的 DataContext? 【参考方案1】:是的,您的SelectedIndex
将始终保持为-1,因为ItemTemplate
Stackpanel 的Holding
事件消耗点击事件的设计约束,ItemClick
和SelectionChanged
事件都不会触发。
要解决这个问题,你会
-
需要遍历你的
VisualTree
直到父
项目模板
将其内容类型转换为您的 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);
【讨论】:
以上是关于无法获得有效的 ListView.SelectedIndex的主要内容,如果未能解决你的问题,请参考以下文章