C# 为什么ItemClick事件处理程序返回上一个单击的项目?

C# 为什么ItemClick事件处理程序返回上一个单击的项目?,c#,listview,event-handling,datatemplate,win-universal-app,C#,Listview,Event Handling,Datatemplate,Win Universal App,我有一个带有网格的ListView ItemTemplate的ListView。 我需要单击的行的信息,该行在ListView上具有IsItemClickEnabled=True,以及带有显示行id的调试的ItemClick事件处理程序 我不明白的是,为什么返回的项目总是我以前单击过的项目,而第一次单击什么也不产生 下面是ListView的标记 <ListView x:Name="ListCustomerView" ItemsSource="{x:Bind CustomersFromDB

我有一个带有网格的ListView ItemTemplate的ListView。 我需要单击的行的信息,该行在ListView上具有
IsItemClickEnabled=True
,以及带有显示行id的调试的
ItemClick
事件处理程序

我不明白的是,为什么返回的项目总是我以前单击过的项目,而第一次单击什么也不产生

下面是ListView的标记

<ListView x:Name="ListCustomerView"  ItemsSource="{x:Bind CustomersFromDB}" Grid.Row="1" HorizontalAlignment="Center" IsItemClickEnabled="True" ItemClick="ListCustomerView_ItemClick">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid IsTapEnabled="False">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>
                    <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition>

                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding CompanyName}"></TextBlock>
                <TextBlock Grid.Column="1" Text="{Binding FirstName}"></TextBlock>
                <TextBlock Grid.Column="2" Text="{Binding LastName}"></TextBlock>
                <TextBlock Grid.Column="3" Text="{Binding Phone}"></TextBlock>
                <TextBlock Grid.Column="4" Text="{Binding Email}"></TextBlock>
                <TextBlock Grid.Column="5" Text="{Binding Adress}"></TextBlock>
                <TextBlock Grid.Column="6" Text="{Binding PostCode}"></TextBlock>
                <TextBlock Grid.Column="7" Text="{Binding PostArea}"></TextBlock>
                <TextBlock Grid.Column="8" Text="{Binding Comment}"></TextBlock>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
如上图所示检索客户,但当我单击一行时,id是单击的上一行,如果是第一次单击,则为null


为什么会发生这种古怪的行为

这是因为您使用的是发送者。SelectedItem提供当前选择。您所需的新选择仅在
单击事件后进行。要获取刚才单击的项目,请使用
e
参数:

private void ListCustomerView_ItemClick(object sender, ItemClickEventArgs e)
{
    Debug.WriteLine(e.ClickedItem.ToString());
}
或者,您可以使用
SelectionChanged
事件代替
ItemClick
事件。这将使用与您相同的代码为您提供新的选择:

private void ListCustomerView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Debug.WriteLine((sender as ListView).SelectedItem.ToString());
}

我还没有测试过它,但我猜click事件发生在selection事件发生之前。因此,当您的click事件处理程序启动时,selecteditem是“先前”选择的内容。我相信您正在查找ItemClickedEventArgs上的属性

是否确定事件顺序不会在ItemClick之后设置SelectedItem?如果您希望在SelectedItem更改时有一个事件,则会有一个事件代替。当然!我真傻,我以前就知道了,但已经有一段时间了。感谢您对SelectionChanged事件的详细解释和提示。
private void ListCustomerView_ItemClick(object sender, ItemClickEventArgs e)
{
    Debug.WriteLine(e.ClickedItem.ToString());
}
private void ListCustomerView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Debug.WriteLine((sender as ListView).SelectedItem.ToString());
}