C# 为什么ItemClick事件处理程序返回上一个单击的项目?
我有一个带有网格的ListView ItemTemplate的ListView。 我需要单击的行的信息,该行在ListView上具有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
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());
}