为什么 ItemClick 事件处理程序返回上一个单击的项目?
Why is the ItemClick event handler returning the previous clicked item?
我有一个带有网格的 ListView ItemTemplate 的 ListView。
我需要被单击的行的信息,并且在 ListView 上有 IsItemClickEnabled=True
和一个 ItemClick
事件处理程序,带有显示行 ID 的调试。
我想不通的是为什么返回的项目总是我之前点击的项目,而第一次点击没有任何结果。
这是 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>
这是 CustomersFromDB ItemsSource 的代码
public List<Customer> CustomersFromDB { get; set; }
var db = new Database();
CustomersFromDB = db.FetchCustomer();
public List<Customer> FetchCustomer()
{
using (SQLiteConnection _connection = new SQLiteConnection(sqlitePlatform, dbFilePath))
{
List<Customer> customers = new List<Customer>();
var _customers = _connection.Table<Customer>();
if (_customers.Count() > 0)
{
foreach (Customer customer in _customers)
{
customers.Add(customer);
}
}
return customers;
}
}
和插图
和事件处理程序
private void ListCustomerView_ItemClick(object sender, ItemClickEventArgs e)
{
// BUG! the selected item is not firing correctly ending up outputting the previous clicked item
Debug.WriteLine((sender as ListView).SelectedItem);
}
如上图所示检索客户,但当我单击一行时,id 是前一个被单击的,如果是第一次单击则为 null。
为什么会发生这种奇怪的行为?
那是因为您使用的是 sender.SelectedItem
,它为您提供了当前选择。您想要的新选择仅在 click
事件之后进行。要获取您刚刚单击的项目,请使用 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());
}
我没有测试过,但我猜测点击事件发生在选择事件发生之前。因此,当您的点击事件处理程序触发时,所选项目就是 "previously" 选择的任何内容。我相信您正在寻找 ItemClickedEventArgs
上的 ClickedItem 属性
我有一个带有网格的 ListView ItemTemplate 的 ListView。
我需要被单击的行的信息,并且在 ListView 上有 IsItemClickEnabled=True
和一个 ItemClick
事件处理程序,带有显示行 ID 的调试。
我想不通的是为什么返回的项目总是我之前点击的项目,而第一次点击没有任何结果。
这是 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>
这是 CustomersFromDB ItemsSource 的代码
public List<Customer> CustomersFromDB { get; set; }
var db = new Database();
CustomersFromDB = db.FetchCustomer();
public List<Customer> FetchCustomer()
{
using (SQLiteConnection _connection = new SQLiteConnection(sqlitePlatform, dbFilePath))
{
List<Customer> customers = new List<Customer>();
var _customers = _connection.Table<Customer>();
if (_customers.Count() > 0)
{
foreach (Customer customer in _customers)
{
customers.Add(customer);
}
}
return customers;
}
}
和插图
和事件处理程序
private void ListCustomerView_ItemClick(object sender, ItemClickEventArgs e)
{
// BUG! the selected item is not firing correctly ending up outputting the previous clicked item
Debug.WriteLine((sender as ListView).SelectedItem);
}
如上图所示检索客户,但当我单击一行时,id 是前一个被单击的,如果是第一次单击则为 null。
为什么会发生这种奇怪的行为?
那是因为您使用的是 sender.SelectedItem
,它为您提供了当前选择。您想要的新选择仅在 click
事件之后进行。要获取您刚刚单击的项目,请使用 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());
}
我没有测试过,但我猜测点击事件发生在选择事件发生之前。因此,当您的点击事件处理程序触发时,所选项目就是 "previously" 选择的任何内容。我相信您正在寻找 ItemClickedEventArgs
上的 ClickedItem 属性