【问题标题】:Can't get a valid ListView.SelectedIndex无法获得有效的 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?

标签: c# windows xaml windows-phone-8


【解决方案1】:

是的,您的SelectedIndex 将始终保持为-1,因为ItemTemplate Stackpanel 的Holding 事件消耗点击事件的设计约束,ItemClickSelectionChanged 事件都不会触发。
要解决这个问题,你会

  1. 需要遍历你的VisualTree直到父 项目模板
  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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2020-02-08
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多