无法获得有效的 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 事件消耗点击事件的设计约束,ItemClickSelectionChanged 事件都不会触发。 要解决这个问题,你会

    需要遍历你的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的主要内容,如果未能解决你的问题,请参考以下文章

无法获得窗口句柄?

Gradle 同步失败:无法找到请求目标的有效证书路径

尽管“全局”,php仍无法获得函数变量

localhost上的测试Laravel API无法获得响应

无法在 IPN 上获得贝宝“已验证”或“无效”

无法获得非常简单的app.yaml设置工作